@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.
Files changed (263) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +586 -0
  3. package/dist/accounts/accounts-client.d.ts +188 -0
  4. package/dist/accounts/accounts-client.d.ts.map +1 -0
  5. package/dist/accounts/accounts-client.js +264 -0
  6. package/dist/accounts/accounts-client.js.map +1 -0
  7. package/dist/accounts/index.d.ts +8 -0
  8. package/dist/accounts/index.d.ts.map +1 -0
  9. package/dist/accounts/index.js +8 -0
  10. package/dist/accounts/index.js.map +1 -0
  11. package/dist/accounts/mock-accounts.d.ts +90 -0
  12. package/dist/accounts/mock-accounts.d.ts.map +1 -0
  13. package/dist/accounts/mock-accounts.js +434 -0
  14. package/dist/accounts/mock-accounts.js.map +1 -0
  15. package/dist/accounts/types.d.ts +180 -0
  16. package/dist/accounts/types.d.ts.map +1 -0
  17. package/dist/accounts/types.js +59 -0
  18. package/dist/accounts/types.js.map +1 -0
  19. package/dist/auth/auth-client.d.ts +224 -0
  20. package/dist/auth/auth-client.d.ts.map +1 -0
  21. package/dist/auth/auth-client.js +230 -0
  22. package/dist/auth/auth-client.js.map +1 -0
  23. package/dist/auth/base-auth.d.ts +44 -0
  24. package/dist/auth/base-auth.d.ts.map +1 -0
  25. package/dist/auth/base-auth.js +55 -0
  26. package/dist/auth/base-auth.js.map +1 -0
  27. package/dist/auth/index.d.ts +11 -0
  28. package/dist/auth/index.d.ts.map +1 -0
  29. package/dist/auth/index.js +11 -0
  30. package/dist/auth/index.js.map +1 -0
  31. package/dist/auth/methods/admin.d.ts +59 -0
  32. package/dist/auth/methods/admin.d.ts.map +1 -0
  33. package/dist/auth/methods/admin.js +55 -0
  34. package/dist/auth/methods/admin.js.map +1 -0
  35. package/dist/auth/methods/index.d.ts +9 -0
  36. package/dist/auth/methods/index.d.ts.map +1 -0
  37. package/dist/auth/methods/index.js +8 -0
  38. package/dist/auth/methods/index.js.map +1 -0
  39. package/dist/auth/methods/magic-link.d.ts +27 -0
  40. package/dist/auth/methods/magic-link.d.ts.map +1 -0
  41. package/dist/auth/methods/magic-link.js +37 -0
  42. package/dist/auth/methods/magic-link.js.map +1 -0
  43. package/dist/auth/methods/mfa.d.ts +92 -0
  44. package/dist/auth/methods/mfa.d.ts.map +1 -0
  45. package/dist/auth/methods/mfa.js +153 -0
  46. package/dist/auth/methods/mfa.js.map +1 -0
  47. package/dist/auth/methods/oauth.d.ts +62 -0
  48. package/dist/auth/methods/oauth.d.ts.map +1 -0
  49. package/dist/auth/methods/oauth.js +165 -0
  50. package/dist/auth/methods/oauth.js.map +1 -0
  51. package/dist/auth/methods/otp.d.ts +43 -0
  52. package/dist/auth/methods/otp.d.ts.map +1 -0
  53. package/dist/auth/methods/otp.js +66 -0
  54. package/dist/auth/methods/otp.js.map +1 -0
  55. package/dist/auth/methods/password.d.ts +64 -0
  56. package/dist/auth/methods/password.d.ts.map +1 -0
  57. package/dist/auth/methods/password.js +116 -0
  58. package/dist/auth/methods/password.js.map +1 -0
  59. package/dist/auth/methods/recovery.d.ts +62 -0
  60. package/dist/auth/methods/recovery.d.ts.map +1 -0
  61. package/dist/auth/methods/recovery.js +100 -0
  62. package/dist/auth/methods/recovery.js.map +1 -0
  63. package/dist/auth/mock-auth.d.ts +135 -0
  64. package/dist/auth/mock-auth.d.ts.map +1 -0
  65. package/dist/auth/mock-auth.js +417 -0
  66. package/dist/auth/mock-auth.js.map +1 -0
  67. package/dist/auth/server/helpers.d.ts +215 -0
  68. package/dist/auth/server/helpers.d.ts.map +1 -0
  69. package/dist/auth/server/helpers.js +241 -0
  70. package/dist/auth/server/helpers.js.map +1 -0
  71. package/dist/auth/server/index.d.ts +24 -0
  72. package/dist/auth/server/index.d.ts.map +1 -0
  73. package/dist/auth/server/index.js +40 -0
  74. package/dist/auth/server/index.js.map +1 -0
  75. package/dist/auth/server/middleware.d.ts +305 -0
  76. package/dist/auth/server/middleware.d.ts.map +1 -0
  77. package/dist/auth/server/middleware.js +405 -0
  78. package/dist/auth/server/middleware.js.map +1 -0
  79. package/dist/auth/server/verify.d.ts +184 -0
  80. package/dist/auth/server/verify.d.ts.map +1 -0
  81. package/dist/auth/server/verify.js +222 -0
  82. package/dist/auth/server/verify.js.map +1 -0
  83. package/dist/auth/token-manager.d.ts +94 -0
  84. package/dist/auth/token-manager.d.ts.map +1 -0
  85. package/dist/auth/token-manager.js +231 -0
  86. package/dist/auth/token-manager.js.map +1 -0
  87. package/dist/auth/types.d.ts +412 -0
  88. package/dist/auth/types.d.ts.map +1 -0
  89. package/dist/auth/types.js +66 -0
  90. package/dist/auth/types.js.map +1 -0
  91. package/dist/auth/user/identities.d.ts +62 -0
  92. package/dist/auth/user/identities.d.ts.map +1 -0
  93. package/dist/auth/user/identities.js +88 -0
  94. package/dist/auth/user/identities.js.map +1 -0
  95. package/dist/auth/user/index.d.ts +4 -0
  96. package/dist/auth/user/index.d.ts.map +1 -0
  97. package/dist/auth/user/index.js +4 -0
  98. package/dist/auth/user/index.js.map +1 -0
  99. package/dist/auth/user/user.d.ts +64 -0
  100. package/dist/auth/user/user.d.ts.map +1 -0
  101. package/dist/auth/user/user.js +105 -0
  102. package/dist/auth/user/user.js.map +1 -0
  103. package/dist/auth/user/verification.d.ts +49 -0
  104. package/dist/auth/user/verification.d.ts.map +1 -0
  105. package/dist/auth/user/verification.js +71 -0
  106. package/dist/auth/user/verification.js.map +1 -0
  107. package/dist/cli/browser.d.ts +11 -0
  108. package/dist/cli/browser.d.ts.map +1 -0
  109. package/dist/cli/browser.js +35 -0
  110. package/dist/cli/browser.js.map +1 -0
  111. package/dist/cli/callback-server.d.ts +30 -0
  112. package/dist/cli/callback-server.d.ts.map +1 -0
  113. package/dist/cli/callback-server.js +100 -0
  114. package/dist/cli/callback-server.js.map +1 -0
  115. package/dist/cli/file-token-store.d.ts +79 -0
  116. package/dist/cli/file-token-store.d.ts.map +1 -0
  117. package/dist/cli/file-token-store.js +138 -0
  118. package/dist/cli/file-token-store.js.map +1 -0
  119. package/dist/cli/index.d.ts +33 -0
  120. package/dist/cli/index.d.ts.map +1 -0
  121. package/dist/cli/index.js +38 -0
  122. package/dist/cli/index.js.map +1 -0
  123. package/dist/cli/oauth.d.ts +67 -0
  124. package/dist/cli/oauth.d.ts.map +1 -0
  125. package/dist/cli/oauth.js +101 -0
  126. package/dist/cli/oauth.js.map +1 -0
  127. package/dist/cli/pkce.d.ts +35 -0
  128. package/dist/cli/pkce.d.ts.map +1 -0
  129. package/dist/cli/pkce.js +43 -0
  130. package/dist/cli/pkce.js.map +1 -0
  131. package/dist/client.d.ts +22 -0
  132. package/dist/client.d.ts.map +1 -0
  133. package/dist/client.js +99 -0
  134. package/dist/client.js.map +1 -0
  135. package/dist/db/client.d.ts +9 -0
  136. package/dist/db/client.d.ts.map +1 -0
  137. package/dist/db/client.js +19 -0
  138. package/dist/db/client.js.map +1 -0
  139. package/dist/db/errors.d.ts +19 -0
  140. package/dist/db/errors.d.ts.map +1 -0
  141. package/dist/db/errors.js +57 -0
  142. package/dist/db/errors.js.map +1 -0
  143. package/dist/db/index.d.ts +7 -0
  144. package/dist/db/index.d.ts.map +1 -0
  145. package/dist/db/index.js +5 -0
  146. package/dist/db/index.js.map +1 -0
  147. package/dist/db/mock.d.ts +28 -0
  148. package/dist/db/mock.d.ts.map +1 -0
  149. package/dist/db/mock.js +459 -0
  150. package/dist/db/mock.js.map +1 -0
  151. package/dist/db/types.d.ts +73 -0
  152. package/dist/db/types.d.ts.map +1 -0
  153. package/dist/db/types.js +2 -0
  154. package/dist/db/types.js.map +1 -0
  155. package/dist/index.d.ts +21 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +20 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/lib/errors.d.ts +33 -0
  160. package/dist/lib/errors.d.ts.map +1 -0
  161. package/dist/lib/errors.js +76 -0
  162. package/dist/lib/errors.js.map +1 -0
  163. package/dist/lib/http.d.ts +81 -0
  164. package/dist/lib/http.d.ts.map +1 -0
  165. package/dist/lib/http.js +163 -0
  166. package/dist/lib/http.js.map +1 -0
  167. package/dist/lib/keys.d.ts +87 -0
  168. package/dist/lib/keys.d.ts.map +1 -0
  169. package/dist/lib/keys.js +147 -0
  170. package/dist/lib/keys.js.map +1 -0
  171. package/dist/lib/paths.d.ts +37 -0
  172. package/dist/lib/paths.d.ts.map +1 -0
  173. package/dist/lib/paths.js +49 -0
  174. package/dist/lib/paths.js.map +1 -0
  175. package/dist/lib/token-store.d.ts +42 -0
  176. package/dist/lib/token-store.d.ts.map +1 -0
  177. package/dist/lib/token-store.js +75 -0
  178. package/dist/lib/token-store.js.map +1 -0
  179. package/dist/mocks/handlers.d.ts +29 -0
  180. package/dist/mocks/handlers.d.ts.map +1 -0
  181. package/dist/mocks/handlers.js +79 -0
  182. package/dist/mocks/handlers.js.map +1 -0
  183. package/dist/mocks/index.d.ts +5 -0
  184. package/dist/mocks/index.d.ts.map +1 -0
  185. package/dist/mocks/index.js +9 -0
  186. package/dist/mocks/index.js.map +1 -0
  187. package/dist/mocks/responses.d.ts +76 -0
  188. package/dist/mocks/responses.d.ts.map +1 -0
  189. package/dist/mocks/responses.js +91 -0
  190. package/dist/mocks/responses.js.map +1 -0
  191. package/dist/mocks/server.d.ts +7 -0
  192. package/dist/mocks/server.d.ts.map +1 -0
  193. package/dist/mocks/server.js +9 -0
  194. package/dist/mocks/server.js.map +1 -0
  195. package/dist/mocks/state.d.ts +86 -0
  196. package/dist/mocks/state.d.ts.map +1 -0
  197. package/dist/mocks/state.js +77 -0
  198. package/dist/mocks/state.js.map +1 -0
  199. package/dist/storage/bucket-ref.d.ts +183 -0
  200. package/dist/storage/bucket-ref.d.ts.map +1 -0
  201. package/dist/storage/bucket-ref.js +529 -0
  202. package/dist/storage/bucket-ref.js.map +1 -0
  203. package/dist/storage/errors.d.ts +27 -0
  204. package/dist/storage/errors.d.ts.map +1 -0
  205. package/dist/storage/errors.js +89 -0
  206. package/dist/storage/errors.js.map +1 -0
  207. package/dist/storage/index.d.ts +13 -0
  208. package/dist/storage/index.d.ts.map +1 -0
  209. package/dist/storage/index.js +11 -0
  210. package/dist/storage/index.js.map +1 -0
  211. package/dist/storage/interface.d.ts +245 -0
  212. package/dist/storage/interface.d.ts.map +1 -0
  213. package/dist/storage/interface.js +2 -0
  214. package/dist/storage/interface.js.map +1 -0
  215. package/dist/storage/mock-storage.d.ts +67 -0
  216. package/dist/storage/mock-storage.d.ts.map +1 -0
  217. package/dist/storage/mock-storage.js +478 -0
  218. package/dist/storage/mock-storage.js.map +1 -0
  219. package/dist/storage/policies-client.d.ts +77 -0
  220. package/dist/storage/policies-client.d.ts.map +1 -0
  221. package/dist/storage/policies-client.js +115 -0
  222. package/dist/storage/policies-client.js.map +1 -0
  223. package/dist/storage/policy-templates.d.ts +6 -0
  224. package/dist/storage/policy-templates.d.ts.map +1 -0
  225. package/dist/storage/policy-templates.js +290 -0
  226. package/dist/storage/policy-templates.js.map +1 -0
  227. package/dist/storage/policy-types.d.ts +98 -0
  228. package/dist/storage/policy-types.d.ts.map +1 -0
  229. package/dist/storage/policy-types.js +20 -0
  230. package/dist/storage/policy-types.js.map +1 -0
  231. package/dist/storage/storage-client.d.ts +32 -0
  232. package/dist/storage/storage-client.d.ts.map +1 -0
  233. package/dist/storage/storage-client.js +94 -0
  234. package/dist/storage/storage-client.js.map +1 -0
  235. package/dist/storage/tus-upload.d.ts +56 -0
  236. package/dist/storage/tus-upload.d.ts.map +1 -0
  237. package/dist/storage/tus-upload.js +236 -0
  238. package/dist/storage/tus-upload.js.map +1 -0
  239. package/dist/storage/types.d.ts +335 -0
  240. package/dist/storage/types.d.ts.map +1 -0
  241. package/dist/storage/types.js +39 -0
  242. package/dist/storage/types.js.map +1 -0
  243. package/dist/test/auth/helpers.d.ts +33 -0
  244. package/dist/test/auth/helpers.d.ts.map +1 -0
  245. package/dist/test/auth/helpers.js +80 -0
  246. package/dist/test/auth/helpers.js.map +1 -0
  247. package/dist/test/helpers/jwt.d.ts +61 -0
  248. package/dist/test/helpers/jwt.d.ts.map +1 -0
  249. package/dist/test/helpers/jwt.js +132 -0
  250. package/dist/test/helpers/jwt.js.map +1 -0
  251. package/dist/test/helpers/mailpit.d.ts +61 -0
  252. package/dist/test/helpers/mailpit.d.ts.map +1 -0
  253. package/dist/test/helpers/mailpit.js +107 -0
  254. package/dist/test/helpers/mailpit.js.map +1 -0
  255. package/dist/test/setup.d.ts +2 -0
  256. package/dist/test/setup.d.ts.map +1 -0
  257. package/dist/test/setup.js +17 -0
  258. package/dist/test/setup.js.map +1 -0
  259. package/dist/types.d.ts +96 -0
  260. package/dist/types.d.ts.map +1 -0
  261. package/dist/types.js +5 -0
  262. package/dist/types.js.map +1 -0
  263. 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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAqBL,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,SAAS,oBAAoB,CAAC,SAAiC;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,SAAS,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,IAAI,SAAS,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,IAAI,SAAS,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,SAAS,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,SAAS,CAAC,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAExE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC9B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,MAAM,CAAC,IAAc;IAClC,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,mCAAmC;IACnC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IAED;IACA;IACA;IAHnB,YACmB,IAAgB,EAChB,QAAgB,EAChB,QAAgB;QAFhB,SAAI,GAAJ,IAAI,CAAY;QAChB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAAQ;IAChC,CAAC;IAEI,IAAI,CAAC,QAAgB;QAC3B,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CACV,IAAY,EACZ,IAAc,EACd,UAAyB,EAAE;QAE3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAEhC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3D,CAAC;QAED,4DAA4D;QAC5D,mEAAmE;QACnE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;QACpE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,EAC7C;YACE,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI;SACX,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QAEpE,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;SACrC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAA2B,EAAE;QACxD,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS;YAChC,CAAC,CAAC,+BAA+B,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,eAAe,EAAE;YAC1E,CAAC,CAAC,yBAAyB,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC/D,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;;;;OASG;IACH,YAAY,CAAC,IAAY,EAAE,UAA4B,EAAE;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,QAAgB,CAAC;QACrB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,QAAQ,GAAG,wBAAwB,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,kBAAkB,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QACvD,CAAC;QAED,IAAI,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAE7C,sCAAsC;QACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAChD,MAAM,aAAa,GACjB,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,IAAI,GAAG,SAAS,YAAY,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;QACrE,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,eAAe,CACnB,IAAY,EACZ,OAAyB;QAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,EAClD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0B,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAEvC,yFAAyF;QACzF,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAC,SAAS;YAChB,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAE7C,sCAAsC;QACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtD,MAAM,aAAa,GACjB,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,SAAS,IAAI,GAAG,SAAS,YAAY,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,OAAO;YACL,SAAS;YACT,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;SACjC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,gBAAgB,CACpB,KAAe,EACf,OAAyB;QAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,EAC1C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK;aACN,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIjC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAEvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,yFAAyF;YACzF,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC,SAAS;gBAChB,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAE7C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBACtD,MAAM,aAAa,GACjB,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,SAAS,IAAI,GAAG,SAAS,YAAY,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3E,CAAC;YAED,OAAO;gBACL,SAAS;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,qBAAqB,CACzB,IAAY,EACZ,UAAkC,EAAE;QAEpC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,EACzD;YACE,MAAM,EAAE,MAAM;YACd,OAAO;SACR,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmC,CAAC;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAEvC,OAAO;YACL,gGAAgG;YAChG,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBACpC,CAAC,CAAC,IAAI,CAAC,GAAG;gBACV,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;SACjC,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,iBAAiB,CACrB,SAAiB,EACjB,KAAa,EACb,IAAc,EACd,UAAyB,EAAE;QAE3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAEhC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,CAAC;QAEF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;QACpE,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,OAAO;YACP,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QAEpE,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5C,QAAQ,EAAE,IAAI,CAAC,GAAG;SACnB,CAAC;IACJ,CAAC;IAEO,aAAa,CACnB,GAAW,EACX,OAA+B,EAC/B,IAAU,EACV,UAAoD;QAEpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;YAEjC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBAC3B,UAAU,CAAC;wBACT,aAAa,EAAE,KAAK,CAAC,MAAM;wBAC3B,UAAU,EAAE,KAAK,CAAC,KAAK;wBACvB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;qBAC3D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;gBAChC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAGvC,CAAC;wBACF,OAAO,CAAC;4BACN,EAAE,EAAE,IAAI,CAAC,EAAE;4BACX,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;4BAC5C,QAAQ,EAAE,IAAI,CAAC,GAAG;yBACnB,CAAC,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACjC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,qBAAqB,CACnB,IAAY,EACZ,IAAc,EACd,OAA0B;QAE1B,OAAO,eAAe,CACpB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ,IAAI,EACJ,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,UAAuB,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,EAC1C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,MAAM,CAAC,UAAyB,EAAE;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CAAC,EAC7C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,cAAc,EAAE,OAAO,CAAC,SAAS;gBACjC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;YAC7B,UAAU,EAAE,IAAI,CAAC,WAAW;SAC7B,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,KAAe;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,EACrC;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;SAC1C,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CACR,QAAgB,EAChB,MAAc,EACd,UAAuB,EAAE;QAEzB,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,QAAQ;gBACnB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,QAAQ;gBAC7D,cAAc,EAAE,MAAM;aACvB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CACR,QAAgB,EAChB,MAAc,EACd,UAAuB,EAAE;QAEzB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,QAAQ;gBACnB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,QAAQ;gBAC7D,cAAc,EAAE,MAAM;gBACtB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;gBAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAC;QAEpE,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,GAAG;SACf,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACzC,IAAI,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,EAChE;YACE,MAAM,EAAE,KAAK;SACd,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;QAClD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CACxB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,EAC7C;gBACE,MAAM,EAAE,MAAM;aACf,CACF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -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