@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,543 @@
1
+ import { createProviderInstrumentation } from "../providers";
2
+ /**
3
+ * Error thrown for expected upload failures.
4
+ */
5
+ export class UploadError extends Error {
6
+ code;
7
+ status;
8
+ details;
9
+ constructor(args) {
10
+ super(args.message);
11
+ this.name = "UploadError";
12
+ this.code = args.code;
13
+ this.status = args.status ?? 400;
14
+ this.details = args.details;
15
+ }
16
+ }
17
+ /**
18
+ * Define a typed upload workflow.
19
+ */
20
+ export function defineUpload(name, options) {
21
+ return {
22
+ kind: "upload",
23
+ name,
24
+ metadata: options.metadata,
25
+ file: {
26
+ ...options.file,
27
+ maxFiles: options.file.maxFiles ?? 1,
28
+ visibility: options.file.visibility ?? "private",
29
+ },
30
+ ...(options.description !== undefined
31
+ ? { description: options.description }
32
+ : {}),
33
+ ...(options.authorize ? { authorize: options.authorize } : {}),
34
+ key: options.key,
35
+ ...(options.storageMetadata
36
+ ? { storageMetadata: options.storageMetadata }
37
+ : {}),
38
+ ...(options.onComplete ? { onComplete: options.onComplete } : {}),
39
+ };
40
+ }
41
+ /**
42
+ * Define a nested upload registry while preserving upload names and metadata
43
+ * types for client code.
44
+ */
45
+ export function defineUploads(uploads) {
46
+ return uploads;
47
+ }
48
+ /**
49
+ * Flatten a nested upload registry into the list expected by
50
+ * `createUploadRouter(...)`.
51
+ */
52
+ export function uploadsFromRegistry(uploads) {
53
+ if (Array.isArray(uploads))
54
+ return [...uploads];
55
+ const result = [];
56
+ for (const value of Object.values(uploads)) {
57
+ if (isUploadDef(value)) {
58
+ result.push(value);
59
+ }
60
+ else {
61
+ result.push(...uploadsFromRegistry(value));
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Create client-safe upload metadata for browser helpers.
68
+ */
69
+ export function createUploadManifest(uploads) {
70
+ return uploadsFromRegistry(uploads).map((upload) => ({
71
+ name: upload.name,
72
+ ...(upload.description !== undefined
73
+ ? { description: upload.description }
74
+ : {}),
75
+ file: upload.file,
76
+ }));
77
+ }
78
+ /**
79
+ * Create deterministic direct upload instructions for tests.
80
+ */
81
+ export function createMemoryUploadSigner(options = {}) {
82
+ const baseUrl = options.baseUrl ?? "https://uploads.beignet.test";
83
+ const expiresAt = options.expiresAt ?? "2100-01-01T00:00:00.000Z";
84
+ return {
85
+ sign(args) {
86
+ return {
87
+ method: "PUT",
88
+ url: `${baseUrl}/${encodeURIComponent(args.key)}`,
89
+ headers: {
90
+ "content-type": args.file.contentType,
91
+ },
92
+ expiresAt,
93
+ };
94
+ },
95
+ };
96
+ }
97
+ /**
98
+ * Create a framework-neutral upload router.
99
+ */
100
+ export function createUploadRouter(options) {
101
+ const uploads = new Map(options.uploads.map((upload) => [upload.name, upload]));
102
+ const id = options.id ?? randomUploadId;
103
+ const instrumentation = createProviderInstrumentation(options.instrumentation, {
104
+ providerName: "uploads",
105
+ watcher: "uploads",
106
+ });
107
+ async function resolveCtx() {
108
+ return typeof options.ctx === "function"
109
+ ? options.ctx()
110
+ : options.ctx;
111
+ }
112
+ function findUpload(name) {
113
+ const upload = uploads.get(name);
114
+ if (!upload) {
115
+ throw new UploadError({
116
+ code: "UPLOAD_NOT_FOUND",
117
+ status: 404,
118
+ message: `Upload "${name}" is not registered.`,
119
+ });
120
+ }
121
+ return upload;
122
+ }
123
+ async function prepare(uploadName, input) {
124
+ const startedAt = Date.now();
125
+ instrumentation.custom({
126
+ name: "upload.prepare.started",
127
+ label: "Upload prepare started",
128
+ summary: uploadName,
129
+ });
130
+ try {
131
+ const upload = findUpload(uploadName);
132
+ const ctx = await resolveCtx();
133
+ const metadata = await parseMetadata(upload, input.metadata);
134
+ assertFiles(upload, input.files);
135
+ const files = [];
136
+ for (const file of input.files) {
137
+ const uploadId = id();
138
+ await assertAuthorized(upload, { ctx, metadata, file, uploadId });
139
+ const key = await upload.key({ ctx, metadata, file, uploadId });
140
+ const storageMetadata = (await upload.storageMetadata?.({ ctx, metadata, file, uploadId })) ??
141
+ {};
142
+ const prepared = {
143
+ ...file,
144
+ uploadId,
145
+ key,
146
+ };
147
+ if (options.signer) {
148
+ prepared.direct = await options.signer.sign({
149
+ uploadName,
150
+ uploadId,
151
+ key,
152
+ file,
153
+ metadata,
154
+ storage: {
155
+ visibility: upload.file.visibility ?? "private",
156
+ ...(upload.file.cacheControl !== undefined
157
+ ? { cacheControl: upload.file.cacheControl }
158
+ : {}),
159
+ metadata: storageMetadata,
160
+ },
161
+ });
162
+ }
163
+ files.push(prepared);
164
+ }
165
+ instrumentation.custom({
166
+ name: "upload.prepare.completed",
167
+ label: "Upload prepare completed",
168
+ summary: `${uploadName} (${files.length} file${files.length === 1 ? "" : "s"})`,
169
+ details: {
170
+ uploadName,
171
+ mode: options.signer ? "direct" : "server",
172
+ fileCount: files.length,
173
+ durationMs: Date.now() - startedAt,
174
+ },
175
+ });
176
+ return {
177
+ uploadName,
178
+ mode: options.signer ? "direct" : "server",
179
+ files,
180
+ };
181
+ }
182
+ catch (error) {
183
+ recordFailure("upload.prepare.failed", uploadName, startedAt, error);
184
+ throw error;
185
+ }
186
+ }
187
+ async function complete(uploadName, input) {
188
+ const startedAt = Date.now();
189
+ instrumentation.custom({
190
+ name: "upload.complete.started",
191
+ label: "Upload complete started",
192
+ summary: uploadName,
193
+ });
194
+ try {
195
+ const upload = findUpload(uploadName);
196
+ const ctx = await resolveCtx();
197
+ const metadata = await parseMetadata(upload, input.metadata);
198
+ assertFiles(upload, input.files);
199
+ const files = [];
200
+ for (const file of input.files) {
201
+ await assertAuthorized(upload, {
202
+ ctx,
203
+ metadata,
204
+ file,
205
+ uploadId: file.uploadId,
206
+ });
207
+ const expectedKey = await upload.key({
208
+ ctx,
209
+ metadata,
210
+ file,
211
+ uploadId: file.uploadId,
212
+ });
213
+ if (file.key !== expectedKey) {
214
+ throw new UploadError({
215
+ code: "INVALID_UPLOAD_FILE",
216
+ status: 422,
217
+ message: `Uploaded object key does not match upload "${upload.name}".`,
218
+ details: {
219
+ expectedKey,
220
+ actualKey: file.key,
221
+ },
222
+ });
223
+ }
224
+ const object = await options.storage.stat(file.key);
225
+ if (!object) {
226
+ throw new UploadError({
227
+ code: "UPLOAD_OBJECT_NOT_FOUND",
228
+ status: 404,
229
+ message: `Uploaded object "${file.key}" was not found.`,
230
+ });
231
+ }
232
+ assertStoredObject(upload, file, object);
233
+ files.push({ ...file, object });
234
+ }
235
+ const result = await upload.onComplete?.({ ctx, metadata, files });
236
+ instrumentation.custom({
237
+ name: "upload.complete.completed",
238
+ label: "Upload complete completed",
239
+ summary: `${uploadName} (${files.length} file${files.length === 1 ? "" : "s"})`,
240
+ details: {
241
+ uploadName,
242
+ fileCount: files.length,
243
+ durationMs: Date.now() - startedAt,
244
+ },
245
+ });
246
+ return {
247
+ uploadName,
248
+ files,
249
+ result,
250
+ };
251
+ }
252
+ catch (error) {
253
+ recordFailure("upload.complete.failed", uploadName, startedAt, error);
254
+ throw error;
255
+ }
256
+ }
257
+ async function upload(uploadName, input) {
258
+ const startedAt = Date.now();
259
+ instrumentation.custom({
260
+ name: "upload.server.started",
261
+ label: "Server upload started",
262
+ summary: uploadName,
263
+ });
264
+ try {
265
+ const definition = findUpload(uploadName);
266
+ const ctx = await resolveCtx();
267
+ const metadata = await parseMetadata(definition, metadataFromFormData(input.formData));
268
+ const webFiles = filesFromFormData(input.formData);
269
+ const intents = webFiles.map(fileIntentFromFile);
270
+ assertFiles(definition, intents);
271
+ const completed = [];
272
+ for (const [index, file] of webFiles.entries()) {
273
+ const intent = intents[index];
274
+ if (!intent)
275
+ continue;
276
+ const uploadId = id();
277
+ await assertAuthorized(definition, {
278
+ ctx,
279
+ metadata,
280
+ file: intent,
281
+ uploadId,
282
+ });
283
+ const key = await definition.key({
284
+ ctx,
285
+ metadata,
286
+ file: intent,
287
+ uploadId,
288
+ });
289
+ const storageMetadata = (await definition.storageMetadata?.({
290
+ ctx,
291
+ metadata,
292
+ file: intent,
293
+ uploadId,
294
+ })) ?? {};
295
+ const object = await options.storage.put(key, file, {
296
+ contentType: intent.contentType,
297
+ ...(definition.file.cacheControl !== undefined
298
+ ? { cacheControl: definition.file.cacheControl }
299
+ : {}),
300
+ metadata: storageMetadata,
301
+ visibility: definition.file.visibility ?? "private",
302
+ });
303
+ completed.push({
304
+ ...intent,
305
+ uploadId,
306
+ key,
307
+ object,
308
+ });
309
+ }
310
+ const result = await definition.onComplete?.({
311
+ ctx,
312
+ metadata,
313
+ files: completed,
314
+ });
315
+ instrumentation.custom({
316
+ name: "upload.server.completed",
317
+ label: "Server upload completed",
318
+ summary: `${uploadName} (${completed.length} file${completed.length === 1 ? "" : "s"})`,
319
+ details: {
320
+ uploadName,
321
+ fileCount: completed.length,
322
+ durationMs: Date.now() - startedAt,
323
+ },
324
+ });
325
+ return {
326
+ uploadName,
327
+ files: completed,
328
+ result,
329
+ };
330
+ }
331
+ catch (error) {
332
+ recordFailure("upload.server.failed", uploadName, startedAt, error);
333
+ throw error;
334
+ }
335
+ }
336
+ function recordFailure(name, uploadName, startedAt, error) {
337
+ instrumentation.custom({
338
+ name,
339
+ label: "Upload failed",
340
+ summary: uploadName,
341
+ details: {
342
+ uploadName,
343
+ durationMs: Date.now() - startedAt,
344
+ error: error instanceof Error ? error.message : String(error),
345
+ },
346
+ });
347
+ }
348
+ return {
349
+ prepare,
350
+ complete,
351
+ upload,
352
+ async handleRequest(request, requestOptions) {
353
+ try {
354
+ if (requestOptions.action === "prepare") {
355
+ const input = (await request.json());
356
+ return jsonResponse(await prepare(requestOptions.uploadName, input));
357
+ }
358
+ if (requestOptions.action === "complete") {
359
+ const input = (await request.json());
360
+ return jsonResponse(await complete(requestOptions.uploadName, input));
361
+ }
362
+ const formData = await request.formData();
363
+ return jsonResponse(await upload(requestOptions.uploadName, {
364
+ formData,
365
+ }));
366
+ }
367
+ catch (error) {
368
+ return uploadErrorResponse(error);
369
+ }
370
+ },
371
+ };
372
+ }
373
+ async function parseMetadata(upload, input) {
374
+ const result = await upload.metadata["~standard"].validate(input);
375
+ if (result.issues?.length) {
376
+ throw new UploadError({
377
+ code: "INVALID_UPLOAD_METADATA",
378
+ status: 422,
379
+ message: `Invalid metadata for upload "${upload.name}".`,
380
+ details: { issues: result.issues },
381
+ });
382
+ }
383
+ if ("value" in result) {
384
+ return result.value;
385
+ }
386
+ throw new Error("Invalid Standard Schema result: missing value");
387
+ }
388
+ function assertFiles(upload, files) {
389
+ const maxFiles = upload.file.maxFiles ?? 1;
390
+ if (files.length === 0 || files.length > maxFiles) {
391
+ throw new UploadError({
392
+ code: "INVALID_UPLOAD_FILE",
393
+ status: 422,
394
+ message: `Upload "${upload.name}" requires between 1 and ${maxFiles} file${maxFiles === 1 ? "" : "s"}.`,
395
+ details: { fileCount: files.length, maxFiles },
396
+ });
397
+ }
398
+ for (const file of files) {
399
+ if (!file.name || !file.contentType || !Number.isFinite(file.size)) {
400
+ throw new UploadError({
401
+ code: "INVALID_UPLOAD_FILE",
402
+ status: 422,
403
+ message: `Upload "${upload.name}" received invalid file metadata.`,
404
+ details: { file },
405
+ });
406
+ }
407
+ if (upload.file.contentTypes?.length &&
408
+ !upload.file.contentTypes.includes(file.contentType)) {
409
+ throw new UploadError({
410
+ code: "INVALID_UPLOAD_FILE",
411
+ status: 415,
412
+ message: `Upload "${upload.name}" does not accept "${file.contentType}".`,
413
+ details: {
414
+ contentType: file.contentType,
415
+ acceptedContentTypes: upload.file.contentTypes,
416
+ },
417
+ });
418
+ }
419
+ if (upload.file.maxSizeBytes !== undefined &&
420
+ file.size > upload.file.maxSizeBytes) {
421
+ throw new UploadError({
422
+ code: "INVALID_UPLOAD_FILE",
423
+ status: 413,
424
+ message: `Upload "${upload.name}" exceeds the maximum file size.`,
425
+ details: {
426
+ size: file.size,
427
+ maxSizeBytes: upload.file.maxSizeBytes,
428
+ },
429
+ });
430
+ }
431
+ }
432
+ }
433
+ async function assertAuthorized(upload, args) {
434
+ const result = await upload.authorize?.(args);
435
+ const denied = result === false ||
436
+ (typeof result === "object" &&
437
+ result !== null &&
438
+ "allowed" in result &&
439
+ result.allowed === false);
440
+ if (!denied)
441
+ return;
442
+ throw new UploadError({
443
+ code: "UNAUTHORIZED_UPLOAD",
444
+ status: 403,
445
+ message: typeof result === "object" && result?.reason
446
+ ? result.reason
447
+ : `Upload "${upload.name}" is not authorized.`,
448
+ });
449
+ }
450
+ function assertStoredObject(upload, file, object) {
451
+ assertFiles(upload, [file]);
452
+ if (object.contentType &&
453
+ file.contentType &&
454
+ object.contentType !== file.contentType) {
455
+ throw new UploadError({
456
+ code: "INVALID_UPLOAD_FILE",
457
+ status: 422,
458
+ message: `Uploaded object "${object.key}" content type does not match the prepared file.`,
459
+ details: {
460
+ expected: file.contentType,
461
+ actual: object.contentType,
462
+ },
463
+ });
464
+ }
465
+ }
466
+ function metadataFromFormData(formData) {
467
+ const metadata = formData.get("metadata");
468
+ if (typeof metadata !== "string")
469
+ return {};
470
+ try {
471
+ return JSON.parse(metadata);
472
+ }
473
+ catch {
474
+ throw new UploadError({
475
+ code: "INVALID_UPLOAD_BODY",
476
+ status: 400,
477
+ message: "Upload metadata must be valid JSON.",
478
+ });
479
+ }
480
+ }
481
+ function filesFromFormData(formData) {
482
+ const values = [...formData.getAll("file"), ...formData.getAll("files")];
483
+ const files = values.filter((value) => value instanceof File);
484
+ if (files.length === 0) {
485
+ throw new UploadError({
486
+ code: "INVALID_UPLOAD_BODY",
487
+ status: 400,
488
+ message: 'Multipart upload must include at least one "file" field.',
489
+ });
490
+ }
491
+ return files;
492
+ }
493
+ function fileIntentFromFile(file) {
494
+ return {
495
+ name: file.name,
496
+ contentType: file.type || "application/octet-stream",
497
+ size: file.size,
498
+ };
499
+ }
500
+ function jsonResponse(body, init) {
501
+ const headers = {
502
+ "content-type": "application/json",
503
+ };
504
+ if (init?.headers) {
505
+ new Headers(init.headers).forEach((value, key) => {
506
+ headers[key] = value;
507
+ });
508
+ }
509
+ return new Response(JSON.stringify(body), {
510
+ status: init?.status ?? 200,
511
+ headers,
512
+ });
513
+ }
514
+ function uploadErrorResponse(error) {
515
+ if (error instanceof UploadError) {
516
+ return jsonResponse({
517
+ error: {
518
+ code: error.code,
519
+ message: error.message,
520
+ ...(error.details !== undefined ? { details: error.details } : {}),
521
+ },
522
+ }, { status: error.status });
523
+ }
524
+ return jsonResponse({
525
+ error: {
526
+ code: "INTERNAL_SERVER_ERROR",
527
+ message: "Internal server error",
528
+ },
529
+ }, { status: 500 });
530
+ }
531
+ function randomUploadId() {
532
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
533
+ return crypto.randomUUID();
534
+ }
535
+ return `upload_${Math.random().toString(36).slice(2)}`;
536
+ }
537
+ function isUploadDef(value) {
538
+ return (typeof value === "object" &&
539
+ value !== null &&
540
+ "kind" in value &&
541
+ value.kind === "upload");
542
+ }
543
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/uploads/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beignet/core",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "description": "Core framework primitives for Beignet",
6
6
  "exports": {
@@ -84,6 +84,14 @@
84
84
  "types": "./dist/testing/index.d.ts",
85
85
  "default": "./dist/testing/index.js"
86
86
  },
87
+ "./uploads": {
88
+ "types": "./dist/uploads/index.d.ts",
89
+ "default": "./dist/uploads/index.js"
90
+ },
91
+ "./uploads/client": {
92
+ "types": "./dist/uploads/client.d.ts",
93
+ "default": "./dist/uploads/client.js"
94
+ },
87
95
  "./server": {
88
96
  "types": "./dist/server/index.d.ts",
89
97
  "default": "./dist/server/index.js"
@@ -102,7 +110,8 @@
102
110
  "build": "tsc",
103
111
  "dev": "tsc --watch",
104
112
  "clean": "rm -rf dist coverage .turbo",
105
- "test": "bun test",
113
+ "test": "bun test && bun run typecheck:types",
114
+ "typecheck:types": "tsc -p tsconfig.type-tests.json",
106
115
  "test:coverage": "bun test --coverage",
107
116
  "lint": "biome check ."
108
117
  },