@beignet/core 0.0.2 → 0.0.3

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 (56) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +55 -6
  3. package/dist/jobs/index.d.ts +138 -4
  4. package/dist/jobs/index.d.ts.map +1 -1
  5. package/dist/jobs/index.js +161 -1
  6. package/dist/jobs/index.js.map +1 -1
  7. package/dist/outbox/index.d.ts +5 -0
  8. package/dist/outbox/index.d.ts.map +1 -1
  9. package/dist/outbox/index.js +59 -3
  10. package/dist/outbox/index.js.map +1 -1
  11. package/dist/providers/instrumentation.d.ts +1 -1
  12. package/dist/providers/instrumentation.d.ts.map +1 -1
  13. package/dist/providers/instrumentation.js.map +1 -1
  14. package/dist/server/hooks/auth.d.ts +50 -65
  15. package/dist/server/hooks/auth.d.ts.map +1 -1
  16. package/dist/server/hooks/auth.js +44 -55
  17. package/dist/server/hooks/auth.js.map +1 -1
  18. package/dist/server/hooks/index.d.ts +1 -1
  19. package/dist/server/hooks/index.d.ts.map +1 -1
  20. package/dist/server/hooks/index.js.map +1 -1
  21. package/dist/server/http.d.ts +52 -0
  22. package/dist/server/http.d.ts.map +1 -1
  23. package/dist/server/http.js +20 -1
  24. package/dist/server/http.js.map +1 -1
  25. package/dist/server/index.d.ts +1 -1
  26. package/dist/server/index.d.ts.map +1 -1
  27. package/dist/server/index.js +1 -1
  28. package/dist/server/index.js.map +1 -1
  29. package/dist/server/server.d.ts +54 -13
  30. package/dist/server/server.d.ts.map +1 -1
  31. package/dist/server/server.js +56 -35
  32. package/dist/server/server.js.map +1 -1
  33. package/dist/testing/index.d.ts +4 -0
  34. package/dist/testing/index.d.ts.map +1 -1
  35. package/dist/testing/index.js +8 -0
  36. package/dist/testing/index.js.map +1 -1
  37. package/dist/uploads/client.d.ts +278 -0
  38. package/dist/uploads/client.d.ts.map +1 -0
  39. package/dist/uploads/client.js +428 -0
  40. package/dist/uploads/client.js.map +1 -0
  41. package/dist/uploads/index.d.ts +361 -0
  42. package/dist/uploads/index.d.ts.map +1 -0
  43. package/dist/uploads/index.js +543 -0
  44. package/dist/uploads/index.js.map +1 -0
  45. package/package.json +11 -2
  46. package/src/jobs/index.ts +326 -5
  47. package/src/outbox/index.ts +83 -3
  48. package/src/providers/instrumentation.ts +7 -1
  49. package/src/server/hooks/auth.ts +89 -162
  50. package/src/server/hooks/index.ts +1 -5
  51. package/src/server/http.ts +79 -0
  52. package/src/server/index.ts +1 -0
  53. package/src/server/server.ts +191 -23
  54. package/src/testing/index.ts +11 -0
  55. package/src/uploads/client.ts +861 -0
  56. package/src/uploads/index.ts +1067 -0
@@ -0,0 +1,428 @@
1
+ /**
2
+ * Error thrown by upload client route requests or direct provider uploads.
3
+ */
4
+ export class UploadClientError extends Error {
5
+ /**
6
+ * Client operation that failed.
7
+ */
8
+ operation;
9
+ /**
10
+ * Upload route name involved in the failure.
11
+ */
12
+ uploadName;
13
+ /**
14
+ * HTTP status when a route or provider response was received.
15
+ */
16
+ status;
17
+ /**
18
+ * Machine-readable error code.
19
+ */
20
+ code;
21
+ /**
22
+ * Structured error details from the upload route, when available.
23
+ */
24
+ details;
25
+ /**
26
+ * Create an upload client error.
27
+ */
28
+ constructor(options) {
29
+ super(options.message, { cause: options.cause });
30
+ this.name = "UploadClientError";
31
+ this.operation = options.operation;
32
+ this.uploadName = options.uploadName;
33
+ this.status = options.status;
34
+ this.code = options.code;
35
+ this.details = options.details;
36
+ }
37
+ }
38
+ /**
39
+ * Create a typed browser upload client for a Beignet upload route.
40
+ */
41
+ export function createUploadClient(options = {}) {
42
+ const baseUrl = normalizeBaseUrl(options.baseUrl ?? "/api/uploads");
43
+ const fetchImpl = options.fetch ?? globalThis.fetch?.bind(globalThis);
44
+ if (!fetchImpl) {
45
+ throw new Error("createUploadClient requires a fetch implementation.");
46
+ }
47
+ async function routeHeaders(routeOptions, contentType) {
48
+ const headers = new Headers();
49
+ if (contentType)
50
+ headers.set("content-type", contentType);
51
+ const shared = await resolveHeaders(options.headers);
52
+ const local = await resolveHeaders(routeOptions?.headers);
53
+ mergeHeaders(headers, shared);
54
+ mergeHeaders(headers, local);
55
+ return headers;
56
+ }
57
+ function routeRequest(routeOptions) {
58
+ return {
59
+ ...options.request,
60
+ ...routeOptions?.request,
61
+ };
62
+ }
63
+ async function prepare(uploadName, prepareOptions) {
64
+ return requestJson({
65
+ fetchImpl,
66
+ url: actionUrl(baseUrl, uploadName, "prepare"),
67
+ operation: "prepare upload",
68
+ uploadName,
69
+ init: {
70
+ ...routeRequest(prepareOptions),
71
+ method: "POST",
72
+ headers: await routeHeaders(prepareOptions, "application/json"),
73
+ signal: prepareOptions.signal,
74
+ body: JSON.stringify({
75
+ metadata: prepareOptions.metadata,
76
+ files: prepareOptions.files.map(fileIntentFromFile),
77
+ }),
78
+ },
79
+ });
80
+ }
81
+ async function complete(uploadName, completeOptions) {
82
+ return requestJson({
83
+ fetchImpl,
84
+ url: actionUrl(baseUrl, uploadName, "complete"),
85
+ operation: "complete upload",
86
+ uploadName,
87
+ init: {
88
+ ...routeRequest(completeOptions),
89
+ method: "POST",
90
+ headers: await routeHeaders(completeOptions, "application/json"),
91
+ signal: completeOptions.signal,
92
+ body: JSON.stringify({
93
+ metadata: completeOptions.metadata,
94
+ files: completeOptions.files.map(completeFileInput),
95
+ }),
96
+ },
97
+ });
98
+ }
99
+ async function server(uploadName, uploadOptions) {
100
+ const formData = new FormData();
101
+ formData.set("metadata", JSON.stringify(uploadOptions.metadata));
102
+ uploadOptions.files.forEach((file) => {
103
+ formData.append("file", file);
104
+ });
105
+ uploadOptions.files.forEach((file, index) => {
106
+ uploadOptions.onFileBegin?.({
107
+ file,
108
+ fileName: file.name,
109
+ index,
110
+ });
111
+ });
112
+ const result = await requestJson({
113
+ fetchImpl,
114
+ url: actionUrl(baseUrl, uploadName, "upload"),
115
+ operation: "server upload",
116
+ uploadName,
117
+ init: {
118
+ ...routeRequest(uploadOptions),
119
+ method: "POST",
120
+ headers: await routeHeaders(uploadOptions),
121
+ signal: uploadOptions.signal,
122
+ body: formData,
123
+ },
124
+ });
125
+ uploadOptions.files.forEach((file, index) => {
126
+ uploadOptions.onProgress?.({
127
+ file,
128
+ fileName: file.name,
129
+ index,
130
+ loaded: file.size,
131
+ total: file.size,
132
+ progress: 1,
133
+ });
134
+ });
135
+ return result;
136
+ }
137
+ async function direct(uploadName, uploadOptions) {
138
+ const prepared = await prepare(uploadName, uploadOptions);
139
+ return directFromPrepared(uploadName, uploadOptions, prepared);
140
+ }
141
+ async function directFromPrepared(uploadName, uploadOptions, prepared) {
142
+ if (prepared.mode !== "direct") {
143
+ throw new UploadClientError({
144
+ operation: "direct upload",
145
+ uploadName,
146
+ code: "DIRECT_UPLOAD_UNAVAILABLE",
147
+ message: `Upload "${uploadName}" did not return direct upload instructions.`,
148
+ });
149
+ }
150
+ await Promise.all(prepared.files.map((preparedFile, index) => uploadDirectFile({
151
+ fetchImpl,
152
+ uploadName,
153
+ preparedFile,
154
+ file: uploadOptions.files[index],
155
+ index,
156
+ signal: uploadOptions.signal,
157
+ onFileBegin: uploadOptions.onFileBegin,
158
+ onProgress: uploadOptions.onProgress,
159
+ })));
160
+ return complete(uploadName, {
161
+ metadata: uploadOptions.metadata,
162
+ files: prepared.files,
163
+ headers: uploadOptions.headers,
164
+ request: uploadOptions.request,
165
+ signal: uploadOptions.signal,
166
+ });
167
+ }
168
+ async function upload(uploadName, uploadOptions) {
169
+ const strategy = uploadOptions.strategy ?? "auto";
170
+ if (strategy === "server")
171
+ return server(uploadName, uploadOptions);
172
+ if (strategy === "direct")
173
+ return direct(uploadName, uploadOptions);
174
+ const prepared = await prepare(uploadName, uploadOptions);
175
+ if (prepared.mode === "direct") {
176
+ return directFromPrepared(uploadName, uploadOptions, prepared);
177
+ }
178
+ return server(uploadName, uploadOptions);
179
+ }
180
+ function constraints(uploadName) {
181
+ return options.manifest?.find((entry) => entry.name === uploadName)?.file;
182
+ }
183
+ function accept(uploadName) {
184
+ return constraints(uploadName)?.contentTypes?.join(",");
185
+ }
186
+ return {
187
+ prepare,
188
+ complete,
189
+ server,
190
+ direct,
191
+ upload,
192
+ constraints,
193
+ accept,
194
+ };
195
+ }
196
+ function fileIntentFromFile(file) {
197
+ return {
198
+ name: file.name,
199
+ contentType: file.type || "application/octet-stream",
200
+ size: file.size,
201
+ };
202
+ }
203
+ function completeFileInput(file) {
204
+ return {
205
+ name: file.name,
206
+ contentType: file.contentType,
207
+ size: file.size,
208
+ uploadId: file.uploadId,
209
+ key: file.key,
210
+ };
211
+ }
212
+ function normalizeBaseUrl(baseUrl) {
213
+ return baseUrl.replace(/\/+$/, "");
214
+ }
215
+ function actionUrl(baseUrl, uploadName, action) {
216
+ return `${baseUrl}/${encodeURIComponent(uploadName)}/${action}`;
217
+ }
218
+ async function resolveHeaders(headers) {
219
+ return typeof headers === "function" ? headers() : headers;
220
+ }
221
+ function mergeHeaders(target, source) {
222
+ if (!source)
223
+ return;
224
+ new Headers(source).forEach((value, key) => {
225
+ target.set(key, value);
226
+ });
227
+ }
228
+ async function requestJson(args) {
229
+ let response;
230
+ try {
231
+ response = await args.fetchImpl(args.url, args.init);
232
+ }
233
+ catch (error) {
234
+ throw new UploadClientError({
235
+ operation: args.operation,
236
+ uploadName: args.uploadName,
237
+ code: "UPLOAD_REQUEST_FAILED",
238
+ message: `Failed to ${args.operation} "${args.uploadName}".`,
239
+ cause: error,
240
+ });
241
+ }
242
+ const body = await parseJsonBody(response, args);
243
+ if (!response.ok) {
244
+ const envelope = uploadErrorEnvelope(body);
245
+ throw new UploadClientError({
246
+ operation: args.operation,
247
+ uploadName: args.uploadName,
248
+ status: response.status,
249
+ code: envelope?.code ?? "UPLOAD_REQUEST_FAILED",
250
+ message: envelope?.message ??
251
+ `Failed to ${args.operation} "${args.uploadName}" (${response.status}).`,
252
+ details: envelope?.details,
253
+ });
254
+ }
255
+ return body;
256
+ }
257
+ async function parseJsonBody(response, args) {
258
+ const text = await response.text();
259
+ if (!text)
260
+ return undefined;
261
+ try {
262
+ return JSON.parse(text);
263
+ }
264
+ catch (error) {
265
+ throw new UploadClientError({
266
+ operation: args.operation,
267
+ uploadName: args.uploadName,
268
+ status: response.status,
269
+ code: "INVALID_UPLOAD_RESPONSE",
270
+ message: `Failed to parse upload response for "${args.uploadName}".`,
271
+ cause: error,
272
+ });
273
+ }
274
+ }
275
+ function uploadErrorEnvelope(body) {
276
+ if (typeof body !== "object" || body === null || !("error" in body)) {
277
+ return undefined;
278
+ }
279
+ const error = body.error;
280
+ if (typeof error !== "object" || error === null)
281
+ return undefined;
282
+ const errorRecord = error;
283
+ return {
284
+ code: typeof errorRecord.code === "string" ? errorRecord.code : undefined,
285
+ message: typeof errorRecord.message === "string" ? errorRecord.message : undefined,
286
+ ...("details" in errorRecord ? { details: errorRecord.details } : {}),
287
+ };
288
+ }
289
+ async function uploadDirectFile(args) {
290
+ const file = args.file;
291
+ if (!file) {
292
+ throw new UploadClientError({
293
+ operation: "direct upload",
294
+ uploadName: args.uploadName,
295
+ code: "INVALID_UPLOAD_FILE",
296
+ message: `Missing browser file for prepared upload "${args.preparedFile.key}".`,
297
+ });
298
+ }
299
+ if (!args.preparedFile.direct) {
300
+ throw new UploadClientError({
301
+ operation: "direct upload",
302
+ uploadName: args.uploadName,
303
+ code: "DIRECT_UPLOAD_UNAVAILABLE",
304
+ message: `Upload "${args.uploadName}" did not include direct instructions for "${args.preparedFile.name}".`,
305
+ });
306
+ }
307
+ args.onFileBegin?.({
308
+ file,
309
+ fileName: file.name,
310
+ index: args.index,
311
+ uploadId: args.preparedFile.uploadId,
312
+ key: args.preparedFile.key,
313
+ });
314
+ if (args.onProgress && typeof XMLHttpRequest !== "undefined") {
315
+ await uploadWithXhr({
316
+ uploadName: args.uploadName,
317
+ preparedFile: args.preparedFile,
318
+ file,
319
+ index: args.index,
320
+ signal: args.signal,
321
+ onProgress: args.onProgress,
322
+ });
323
+ return;
324
+ }
325
+ const response = await args.fetchImpl(args.preparedFile.direct.url, {
326
+ method: args.preparedFile.direct.method,
327
+ headers: args.preparedFile.direct.headers,
328
+ signal: args.signal,
329
+ body: file,
330
+ });
331
+ if (!response.ok) {
332
+ throw new UploadClientError({
333
+ operation: "direct upload",
334
+ uploadName: args.uploadName,
335
+ status: response.status,
336
+ code: "DIRECT_UPLOAD_FAILED",
337
+ message: `Direct upload failed for "${args.preparedFile.name}" (${response.status}).`,
338
+ });
339
+ }
340
+ args.onProgress?.({
341
+ file,
342
+ fileName: file.name,
343
+ index: args.index,
344
+ uploadId: args.preparedFile.uploadId,
345
+ key: args.preparedFile.key,
346
+ loaded: file.size,
347
+ total: file.size,
348
+ progress: 1,
349
+ });
350
+ }
351
+ function uploadWithXhr(args) {
352
+ return new Promise((resolve, reject) => {
353
+ const xhr = new XMLHttpRequest();
354
+ const direct = args.preparedFile.direct;
355
+ if (!direct) {
356
+ reject(new UploadClientError({
357
+ operation: "direct upload",
358
+ uploadName: args.uploadName,
359
+ code: "DIRECT_UPLOAD_UNAVAILABLE",
360
+ message: `Upload "${args.uploadName}" did not include direct instructions for "${args.preparedFile.name}".`,
361
+ }));
362
+ return;
363
+ }
364
+ const abort = () => xhr.abort();
365
+ args.signal?.addEventListener("abort", abort, { once: true });
366
+ xhr.upload.onprogress = (event) => {
367
+ const total = event.lengthComputable ? event.total : args.file.size;
368
+ args.onProgress?.({
369
+ file: args.file,
370
+ fileName: args.file.name,
371
+ index: args.index,
372
+ uploadId: args.preparedFile.uploadId,
373
+ key: args.preparedFile.key,
374
+ loaded: event.loaded,
375
+ total,
376
+ progress: total > 0 ? event.loaded / total : 0,
377
+ });
378
+ };
379
+ xhr.onload = () => {
380
+ args.signal?.removeEventListener("abort", abort);
381
+ if (xhr.status >= 200 && xhr.status < 300) {
382
+ args.onProgress?.({
383
+ file: args.file,
384
+ fileName: args.file.name,
385
+ index: args.index,
386
+ uploadId: args.preparedFile.uploadId,
387
+ key: args.preparedFile.key,
388
+ loaded: args.file.size,
389
+ total: args.file.size,
390
+ progress: 1,
391
+ });
392
+ resolve();
393
+ return;
394
+ }
395
+ reject(new UploadClientError({
396
+ operation: "direct upload",
397
+ uploadName: args.uploadName,
398
+ status: xhr.status,
399
+ code: "DIRECT_UPLOAD_FAILED",
400
+ message: `Direct upload failed for "${args.preparedFile.name}" (${xhr.status}).`,
401
+ }));
402
+ };
403
+ xhr.onerror = () => {
404
+ args.signal?.removeEventListener("abort", abort);
405
+ reject(new UploadClientError({
406
+ operation: "direct upload",
407
+ uploadName: args.uploadName,
408
+ code: "DIRECT_UPLOAD_FAILED",
409
+ message: `Direct upload failed for "${args.preparedFile.name}".`,
410
+ }));
411
+ };
412
+ xhr.onabort = () => {
413
+ args.signal?.removeEventListener("abort", abort);
414
+ reject(new UploadClientError({
415
+ operation: "direct upload",
416
+ uploadName: args.uploadName,
417
+ code: "DIRECT_UPLOAD_ABORTED",
418
+ message: `Direct upload was aborted for "${args.preparedFile.name}".`,
419
+ }));
420
+ };
421
+ xhr.open(direct.method, direct.url);
422
+ for (const [key, value] of Object.entries(direct.headers ?? {})) {
423
+ xhr.setRequestHeader(key, value);
424
+ }
425
+ xhr.send(args.file);
426
+ });
427
+ }
428
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/uploads/client.ts"],"names":[],"mappings":"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"}