@vibesdotdev/media 0.0.0-stage → 1.0.0-rc.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.
- package/LICENSE +18 -0
- package/README.md +95 -2
- package/dist/analyzers/frame-guard.d.ts +6 -0
- package/dist/analyzers/frame-guard.d.ts.map +1 -0
- package/dist/analyzers/frame-guard.js +10 -0
- package/dist/analyzers/frame-guard.js.map +1 -0
- package/dist/analyzers/motion-math.d.ts +66 -0
- package/dist/analyzers/motion-math.d.ts.map +1 -0
- package/dist/analyzers/motion-math.js +356 -0
- package/dist/analyzers/motion-math.js.map +1 -0
- package/dist/analyzers/reference-motion-analyzer.impl.d.ts +23 -0
- package/dist/analyzers/reference-motion-analyzer.impl.d.ts.map +1 -0
- package/dist/analyzers/reference-motion-analyzer.impl.js +69 -0
- package/dist/analyzers/reference-motion-analyzer.impl.js.map +1 -0
- package/dist/analyzers/reference-motion.descriptor.d.ts +11 -0
- package/dist/analyzers/reference-motion.descriptor.d.ts.map +1 -0
- package/dist/analyzers/reference-motion.descriptor.js +21 -0
- package/dist/analyzers/reference-motion.descriptor.js.map +1 -0
- package/dist/capture-client.d.ts +34 -0
- package/dist/capture-client.d.ts.map +1 -0
- package/dist/capture-client.js +163 -0
- package/dist/capture-client.js.map +1 -0
- package/dist/config/media.uploads.config.descriptor.d.ts +27 -0
- package/dist/config/media.uploads.config.descriptor.d.ts.map +1 -0
- package/dist/config/media.uploads.config.descriptor.js +46 -0
- package/dist/config/media.uploads.config.descriptor.js.map +1 -0
- package/dist/config/uploads.d.ts +11 -0
- package/dist/config/uploads.d.ts.map +1 -0
- package/dist/config/uploads.js +25 -0
- package/dist/config/uploads.js.map +1 -0
- package/dist/docs/artifact-references.docs.descriptor.d.ts +4 -0
- package/dist/docs/artifact-references.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/artifact-references.docs.descriptor.js +69 -0
- package/dist/docs/artifact-references.docs.descriptor.js.map +1 -0
- package/dist/docs/image-transform.docs.descriptor.d.ts +4 -0
- package/dist/docs/image-transform.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/image-transform.docs.descriptor.js +52 -0
- package/dist/docs/image-transform.docs.descriptor.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/capture-provider.d.ts +33 -0
- package/dist/interfaces/capture-provider.d.ts.map +1 -0
- package/dist/interfaces/capture-provider.js +10 -0
- package/dist/interfaces/capture-provider.js.map +1 -0
- package/dist/interfaces/image-transformer.d.ts +7 -0
- package/dist/interfaces/image-transformer.d.ts.map +1 -0
- package/dist/interfaces/image-transformer.js +2 -0
- package/dist/interfaces/image-transformer.js.map +1 -0
- package/dist/interfaces/index.d.ts +7 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +5 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/motion-analyzer.d.ts +55 -0
- package/dist/interfaces/motion-analyzer.d.ts.map +1 -0
- package/dist/interfaces/motion-analyzer.js +14 -0
- package/dist/interfaces/motion-analyzer.js.map +1 -0
- package/dist/kinds/capture.d.ts +58 -0
- package/dist/kinds/capture.d.ts.map +1 -0
- package/dist/kinds/capture.js +34 -0
- package/dist/kinds/capture.js.map +1 -0
- package/dist/kinds/image-transform.d.ts +91 -0
- package/dist/kinds/image-transform.d.ts.map +1 -0
- package/dist/kinds/image-transform.js +12 -0
- package/dist/kinds/image-transform.js.map +1 -0
- package/dist/kinds/index.d.ts +10 -0
- package/dist/kinds/index.d.ts.map +1 -0
- package/dist/kinds/index.js +7 -0
- package/dist/kinds/index.js.map +1 -0
- package/dist/kinds/motion.d.ts +57 -0
- package/dist/kinds/motion.d.ts.map +1 -0
- package/dist/kinds/motion.js +34 -0
- package/dist/kinds/motion.js.map +1 -0
- package/dist/media.plugin.d.ts +23 -0
- package/dist/media.plugin.d.ts.map +1 -0
- package/dist/media.plugin.js +48 -0
- package/dist/media.plugin.js.map +1 -0
- package/dist/schemas/artifact-reference.d.ts +59 -0
- package/dist/schemas/artifact-reference.d.ts.map +1 -0
- package/dist/schemas/artifact-reference.js +77 -0
- package/dist/schemas/artifact-reference.js.map +1 -0
- package/dist/schemas/capture-descriptor.d.ts +71 -0
- package/dist/schemas/capture-descriptor.d.ts.map +1 -0
- package/dist/schemas/capture-descriptor.js +74 -0
- package/dist/schemas/capture-descriptor.js.map +1 -0
- package/dist/schemas/capture-options.d.ts +51 -0
- package/dist/schemas/capture-options.d.ts.map +1 -0
- package/dist/schemas/capture-options.js +68 -0
- package/dist/schemas/capture-options.js.map +1 -0
- package/dist/schemas/capture-parse.d.ts +10 -0
- package/dist/schemas/capture-parse.d.ts.map +1 -0
- package/dist/schemas/capture-parse.js +30 -0
- package/dist/schemas/capture-parse.js.map +1 -0
- package/dist/schemas/capture-state.d.ts +77 -0
- package/dist/schemas/capture-state.d.ts.map +1 -0
- package/dist/schemas/capture-state.js +25 -0
- package/dist/schemas/capture-state.js.map +1 -0
- package/dist/schemas/image-transform.d.ts +269 -0
- package/dist/schemas/image-transform.d.ts.map +1 -0
- package/dist/schemas/image-transform.js +161 -0
- package/dist/schemas/image-transform.js.map +1 -0
- package/dist/schemas/index.d.ts +20 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +17 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/motion-analysis.d.ts +187 -0
- package/dist/schemas/motion-analysis.d.ts.map +1 -0
- package/dist/schemas/motion-analysis.js +213 -0
- package/dist/schemas/motion-analysis.js.map +1 -0
- package/dist/schemas/motion-descriptor.d.ts +53 -0
- package/dist/schemas/motion-descriptor.d.ts.map +1 -0
- package/dist/schemas/motion-descriptor.js +47 -0
- package/dist/schemas/motion-descriptor.js.map +1 -0
- package/dist/schemas/motion-frame.d.ts +63 -0
- package/dist/schemas/motion-frame.d.ts.map +1 -0
- package/dist/schemas/motion-frame.js +86 -0
- package/dist/schemas/motion-frame.js.map +1 -0
- package/dist/schemas/opaque-id.d.ts +10 -0
- package/dist/schemas/opaque-id.d.ts.map +1 -0
- package/dist/schemas/opaque-id.js +24 -0
- package/dist/schemas/opaque-id.js.map +1 -0
- package/dist/schemas/sharing-state.d.ts +43 -0
- package/dist/schemas/sharing-state.d.ts.map +1 -0
- package/dist/schemas/sharing-state.js +11 -0
- package/dist/schemas/sharing-state.js.map +1 -0
- package/dist/svelte/CaptureLoader.svelte +29 -0
- package/dist/svelte/CaptureLoader.svelte.d.ts +11 -0
- package/dist/svelte/CaptureLoader.svelte.d.ts.map +1 -0
- package/dist/svelte/CapturePanel.svelte +189 -0
- package/dist/svelte/CapturePanel.svelte.d.ts +12 -0
- package/dist/svelte/CapturePanel.svelte.d.ts.map +1 -0
- package/dist/svelte/MediaUploader.svelte +109 -0
- package/dist/svelte/MediaUploader.svelte.d.ts +5 -0
- package/dist/svelte/MediaUploader.svelte.d.ts.map +1 -0
- package/dist/svelte/capture-parse.d.ts +2 -0
- package/dist/svelte/capture-parse.d.ts.map +1 -0
- package/dist/svelte/capture-parse.js +1 -0
- package/dist/svelte/failure-message.d.ts +2 -0
- package/dist/svelte/failure-message.d.ts.map +1 -0
- package/dist/svelte/failure-message.js +1 -0
- package/dist/svelte/index.d.ts +8 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +6 -0
- package/dist/svelte/runtime-log.d.ts +14 -0
- package/dist/svelte/runtime-log.d.ts.map +1 -0
- package/dist/svelte/runtime-log.js +19 -0
- package/dist/svelte/runtime.d.ts +9 -0
- package/dist/svelte/runtime.d.ts.map +1 -0
- package/dist/svelte/runtime.js +27 -0
- package/dist/svelte/sharing/README.md +38 -0
- package/dist/svelte/sharing/components/ShareButton.svelte +57 -0
- package/dist/svelte/sharing/components/ShareButton.svelte.d.ts +11 -0
- package/dist/svelte/sharing/components/ShareButton.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/components/ShareDialog.svelte +222 -0
- package/dist/svelte/sharing/components/ShareDialog.svelte.d.ts +8 -0
- package/dist/svelte/sharing/components/ShareDialog.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/components/ShareLoader.svelte +19 -0
- package/dist/svelte/sharing/components/ShareLoader.svelte.d.ts +7 -0
- package/dist/svelte/sharing/components/ShareLoader.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/index.d.ts +20 -0
- package/dist/svelte/sharing/index.d.ts.map +1 -0
- package/dist/svelte/sharing/index.js +19 -0
- package/dist/svelte/sharing/runtime.d.ts +44 -0
- package/dist/svelte/sharing/runtime.d.ts.map +1 -0
- package/dist/svelte/sharing/runtime.js +81 -0
- package/dist/svelte/sharing/state.svelte.d.ts +28 -0
- package/dist/svelte/sharing/state.svelte.d.ts.map +1 -0
- package/dist/svelte/sharing/state.svelte.js +101 -0
- package/dist/svelte/sharing/styles.css +8 -0
- package/dist/svelte/state.svelte.d.ts +38 -0
- package/dist/svelte/state.svelte.d.ts.map +1 -0
- package/dist/svelte/state.svelte.js +102 -0
- package/dist/svelte/styles.css +2 -0
- package/dist/svelte/uploader.d.ts +17 -0
- package/dist/svelte/uploader.d.ts.map +1 -0
- package/dist/svelte/uploader.js +9 -0
- package/dist/uploads/adapters/local/index.d.ts +9 -0
- package/dist/uploads/adapters/local/index.d.ts.map +1 -0
- package/dist/uploads/adapters/local/index.js +12 -0
- package/dist/uploads/adapters/local/index.js.map +1 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.d.ts +24 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.d.ts.map +1 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.js +20 -0
- package/dist/uploads/adapters/local/local-storage.descriptor.js.map +1 -0
- package/dist/uploads/adapters/local/local-storage.impl.d.ts +123 -0
- package/dist/uploads/adapters/local/local-storage.impl.d.ts.map +1 -0
- package/dist/uploads/adapters/local/local-storage.impl.js +231 -0
- package/dist/uploads/adapters/local/local-storage.impl.js.map +1 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.d.ts +9 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.d.ts.map +1 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.js +41 -0
- package/dist/uploads/adapters/local/uploads-adapter-local.plugin.js.map +1 -0
- package/dist/uploads/client/helper.d.ts +26 -0
- package/dist/uploads/client/helper.d.ts.map +1 -0
- package/dist/uploads/client/helper.js +27 -0
- package/dist/uploads/client/helper.js.map +1 -0
- package/dist/uploads/client/index.d.ts +11 -0
- package/dist/uploads/client/index.d.ts.map +1 -0
- package/dist/uploads/client/index.js +9 -0
- package/dist/uploads/client/index.js.map +1 -0
- package/dist/uploads/client/sharing-client.d.ts +45 -0
- package/dist/uploads/client/sharing-client.d.ts.map +1 -0
- package/dist/uploads/client/sharing-client.js +153 -0
- package/dist/uploads/client/sharing-client.js.map +1 -0
- package/dist/uploads/client/uploads-client.d.ts +200 -0
- package/dist/uploads/client/uploads-client.d.ts.map +1 -0
- package/dist/uploads/client/uploads-client.js +487 -0
- package/dist/uploads/client/uploads-client.js.map +1 -0
- package/dist/uploads/docs/uploads.docs.descriptor.d.ts +4 -0
- package/dist/uploads/docs/uploads.docs.descriptor.d.ts.map +1 -0
- package/dist/uploads/docs/uploads.docs.descriptor.js +65 -0
- package/dist/uploads/docs/uploads.docs.descriptor.js.map +1 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.d.ts +22 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.d.ts.map +1 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.js +86 -0
- package/dist/uploads/docs/uploads.share-links.docs.descriptor.js.map +1 -0
- package/dist/uploads/index.d.ts +12 -0
- package/dist/uploads/index.d.ts.map +1 -0
- package/dist/uploads/index.js +13 -0
- package/dist/uploads/index.js.map +1 -0
- package/dist/uploads/schemas/common.d.ts +135 -0
- package/dist/uploads/schemas/common.d.ts.map +1 -0
- package/dist/uploads/schemas/common.js +152 -0
- package/dist/uploads/schemas/common.js.map +1 -0
- package/dist/uploads/schemas/forms.d.ts +59 -0
- package/dist/uploads/schemas/forms.d.ts.map +1 -0
- package/dist/uploads/schemas/forms.js +41 -0
- package/dist/uploads/schemas/forms.js.map +1 -0
- package/dist/uploads/schemas/index.d.ts +18 -0
- package/dist/uploads/schemas/index.d.ts.map +1 -0
- package/dist/uploads/schemas/index.js +13 -0
- package/dist/uploads/schemas/index.js.map +1 -0
- package/dist/uploads/schemas/records.d.ts +81 -0
- package/dist/uploads/schemas/records.d.ts.map +1 -0
- package/dist/uploads/schemas/records.js +82 -0
- package/dist/uploads/schemas/records.js.map +1 -0
- package/dist/uploads/schemas/requests.d.ts +32 -0
- package/dist/uploads/schemas/requests.d.ts.map +1 -0
- package/dist/uploads/schemas/requests.js +30 -0
- package/dist/uploads/schemas/requests.js.map +1 -0
- package/dist/uploads/schemas/shares.d.ts +67 -0
- package/dist/uploads/schemas/shares.d.ts.map +1 -0
- package/dist/uploads/schemas/shares.js +39 -0
- package/dist/uploads/schemas/shares.js.map +1 -0
- package/dist/uploads/server/backend.d.ts +8 -0
- package/dist/uploads/server/backend.d.ts.map +1 -0
- package/dist/uploads/server/backend.js +11 -0
- package/dist/uploads/server/backend.js.map +1 -0
- package/dist/uploads/server/config.d.ts +5 -0
- package/dist/uploads/server/config.d.ts.map +1 -0
- package/dist/uploads/server/config.js +38 -0
- package/dist/uploads/server/config.js.map +1 -0
- package/dist/uploads/server/service.d.ts +77 -0
- package/dist/uploads/server/service.d.ts.map +1 -0
- package/dist/uploads/server/service.js +152 -0
- package/dist/uploads/server/service.js.map +1 -0
- package/dist/uploads/server/storage-client.d.ts +11 -0
- package/dist/uploads/server/storage-client.d.ts.map +1 -0
- package/dist/uploads/server/storage-client.js +23 -0
- package/dist/uploads/server/storage-client.js.map +1 -0
- package/dist/uploads/server/storage.d.ts +40 -0
- package/dist/uploads/server/storage.d.ts.map +1 -0
- package/dist/uploads/server/storage.js +59 -0
- package/dist/uploads/server/storage.js.map +1 -0
- package/dist/uploads/uploads.plugin.d.ts +11 -0
- package/dist/uploads/uploads.plugin.d.ts.map +1 -0
- package/dist/uploads/uploads.plugin.js +89 -0
- package/dist/uploads/uploads.plugin.js.map +1 -0
- package/dist/utils/attempt.d.ts +27 -0
- package/dist/utils/attempt.d.ts.map +1 -0
- package/dist/utils/attempt.js +39 -0
- package/dist/utils/attempt.js.map +1 -0
- package/dist/utils/failure-message.d.ts +8 -0
- package/dist/utils/failure-message.d.ts.map +1 -0
- package/dist/utils/failure-message.js +28 -0
- package/dist/utils/failure-message.js.map +1 -0
- package/package.json +257 -4
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload Storage Service
|
|
3
|
+
*
|
|
4
|
+
* Core service class for handling file uploads.
|
|
5
|
+
* Delegates backend operations to adapter packages via runtime resolution:
|
|
6
|
+
* - uploads-adapter-s3 for S3 backend
|
|
7
|
+
* - uploads-adapter-local for local filesystem backend
|
|
8
|
+
* - uploads-adapter-r2 for Cloudflare R2 backend
|
|
9
|
+
*
|
|
10
|
+
* Adapters are resolved via runtime.query('uploads/store').withId(backend).resolve()
|
|
11
|
+
* NOT via if (config.backend === 's3') branching.
|
|
12
|
+
*/
|
|
13
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
14
|
+
import { defaultUploadsBackend } from "./backend.js";
|
|
15
|
+
import { loadUploadsConfig } from "../../config/uploads.js";
|
|
16
|
+
import { parseRequest } from "../schemas/requests.js";
|
|
17
|
+
import { uploadStorageOptionsSchema, validateUpload, MAX_FILE_SIZE, ALLOWED_MIME_TYPES, } from "../schemas/common.js";
|
|
18
|
+
/** Local path when the uploads config does not name one. */
|
|
19
|
+
const DEFAULT_LOCAL_PATH = 'uploads';
|
|
20
|
+
export class UploadStorageService {
|
|
21
|
+
runtime;
|
|
22
|
+
config;
|
|
23
|
+
adapter = null;
|
|
24
|
+
backendWasExplicit;
|
|
25
|
+
backendFromManifest = false;
|
|
26
|
+
constructor(runtime, config) {
|
|
27
|
+
this.runtime = runtime;
|
|
28
|
+
this.backendWasExplicit = config?.backend !== undefined;
|
|
29
|
+
this.config = {
|
|
30
|
+
localPath: DEFAULT_LOCAL_PATH,
|
|
31
|
+
...config,
|
|
32
|
+
backend: config?.backend ?? defaultUploadsBackend()
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get or create the storage adapter instance via runtime resolution.
|
|
37
|
+
*
|
|
38
|
+
* Uses runtime.query('uploads/store').withId(backend).resolve() to select
|
|
39
|
+
* the appropriate adapter based on config.backend ('local', 's3', 'r2').
|
|
40
|
+
* This replaces the prior if (config.backend === 's3') branching pattern.
|
|
41
|
+
*
|
|
42
|
+
* Adapters (uploads-adapter-local, uploads-adapter-s3, uploads-adapter-r2)
|
|
43
|
+
* self-register with ids 'local', 's3', 'r2' matching config.backend values.
|
|
44
|
+
*/
|
|
45
|
+
async getAdapter() {
|
|
46
|
+
if (this.adapter) {
|
|
47
|
+
return this.adapter;
|
|
48
|
+
}
|
|
49
|
+
if (!this.backendWasExplicit && !this.backendFromManifest) {
|
|
50
|
+
const uploads = await loadUploadsConfig(this.runtime);
|
|
51
|
+
this.config = { ...this.config, backend: uploads.backend, localPath: uploads.localPath };
|
|
52
|
+
this.backendFromManifest = true;
|
|
53
|
+
}
|
|
54
|
+
// Runtime resolution: select adapter by backend id
|
|
55
|
+
this.adapter = await this.runtime
|
|
56
|
+
.query('uploads/store')
|
|
57
|
+
.withId(this.config.backend)
|
|
58
|
+
.resolve();
|
|
59
|
+
return this.adapter;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validates file size and MIME type before storage
|
|
63
|
+
*/
|
|
64
|
+
validateFile(buffer, contentType) {
|
|
65
|
+
const parsed = parseRequest(uploadStorageOptionsSchema.pick({ buffer: true, contentType: true }), { buffer, contentType });
|
|
66
|
+
if (!parsed.success) {
|
|
67
|
+
return { valid: false, error: new CapabilityError('The upload payload is invalid.', 'INVALID_INPUT', { reason: 'upload-options-invalid' }) };
|
|
68
|
+
}
|
|
69
|
+
const result = validateUpload(parsed.data.buffer.byteLength, parsed.data.contentType);
|
|
70
|
+
if (!result.valid) {
|
|
71
|
+
return { valid: false, error: result.error };
|
|
72
|
+
}
|
|
73
|
+
return { valid: true };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Saves a file to storage (local or S3)
|
|
77
|
+
*/
|
|
78
|
+
async saveFile(input) {
|
|
79
|
+
const parsed = parseRequest(uploadStorageOptionsSchema, input);
|
|
80
|
+
if (!parsed.success) {
|
|
81
|
+
throw new CapabilityError('The storage upload request is invalid.', 'INVALID_INPUT', { reason: 'upload-options-invalid' });
|
|
82
|
+
}
|
|
83
|
+
const options = parsed.data;
|
|
84
|
+
// Validate before saving
|
|
85
|
+
const validation = validateUpload(options.buffer.byteLength, options.contentType);
|
|
86
|
+
if (!validation.valid) {
|
|
87
|
+
throw validation.error;
|
|
88
|
+
}
|
|
89
|
+
const adapter = await this.getAdapter();
|
|
90
|
+
return adapter.save(options);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Retrieves file content from storage
|
|
94
|
+
*/
|
|
95
|
+
async getFile(storagePath) {
|
|
96
|
+
const adapter = await this.getAdapter();
|
|
97
|
+
return adapter.get(storagePath);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Deletes a file from storage
|
|
101
|
+
*/
|
|
102
|
+
async deleteFile(storagePath) {
|
|
103
|
+
const adapter = await this.getAdapter();
|
|
104
|
+
return adapter.delete(storagePath);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Generates a signed URL for temporary access to private S3 objects
|
|
108
|
+
*/
|
|
109
|
+
async getSignedUrl(storagePath, expiresSeconds = 3600) {
|
|
110
|
+
const adapter = await this.getAdapter();
|
|
111
|
+
return adapter.getSignedUrl(storagePath, expiresSeconds);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Returns a public URL for accessing the file
|
|
115
|
+
*/
|
|
116
|
+
async getPublicUrl(storagePath) {
|
|
117
|
+
const adapter = await this.getAdapter();
|
|
118
|
+
return adapter.getPublicUrl(storagePath);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Checks if a storage path is a local path
|
|
122
|
+
*/
|
|
123
|
+
isLocalPath(storagePath) {
|
|
124
|
+
return storagePath.startsWith('/uploads/');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Parses an s3:// URI into bucket and key components
|
|
128
|
+
*/
|
|
129
|
+
parseS3Path(storagePath) {
|
|
130
|
+
if (!storagePath.startsWith('s3://'))
|
|
131
|
+
return null;
|
|
132
|
+
const rest = storagePath.slice(5);
|
|
133
|
+
const slashIndex = rest.indexOf('/');
|
|
134
|
+
if (slashIndex < 0)
|
|
135
|
+
return null;
|
|
136
|
+
return {
|
|
137
|
+
bucket: rest.slice(0, slashIndex),
|
|
138
|
+
key: rest.slice(slashIndex + 1)
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Configuration getters
|
|
142
|
+
getConfig() {
|
|
143
|
+
return { ...this.config };
|
|
144
|
+
}
|
|
145
|
+
getMaxFileSize() {
|
|
146
|
+
return MAX_FILE_SIZE;
|
|
147
|
+
}
|
|
148
|
+
getAllowedMimeTypes() {
|
|
149
|
+
return ALLOWED_MIME_TYPES;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/uploads/server/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
2
|
+
import { UploadStorageService } from './service.ts';
|
|
3
|
+
/** Runtime-owned default storage service; BaseRuntimeClient retries failed loads. */
|
|
4
|
+
export declare class UploadStorageClient extends BaseRuntimeClient {
|
|
5
|
+
private service?;
|
|
6
|
+
protected onLoad(): Promise<void>;
|
|
7
|
+
getService(): Promise<UploadStorageService>;
|
|
8
|
+
protected onDispose(): void;
|
|
9
|
+
}
|
|
10
|
+
export default UploadStorageClient;
|
|
11
|
+
//# sourceMappingURL=storage-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-client.d.ts","sourceRoot":"","sources":["../../../src/uploads/server/storage-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,qFAAqF;AACrF,qBAAa,mBAAoB,SAAQ,iBAAiB;IACzD,OAAO,CAAC,OAAO,CAAC,CAAuB;cAEd,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;cAM9B,SAAS,IAAI,IAAI;CAGpC;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
3
|
+
import { UploadStorageService } from "./service.js";
|
|
4
|
+
import { buildConfig } from "./config.js";
|
|
5
|
+
/** Runtime-owned default storage service; BaseRuntimeClient retries failed loads. */
|
|
6
|
+
export class UploadStorageClient extends BaseRuntimeClient {
|
|
7
|
+
service;
|
|
8
|
+
async onLoad() {
|
|
9
|
+
await super.onLoad();
|
|
10
|
+
this.service = new UploadStorageService(this.runtime, await buildConfig(this.runtime));
|
|
11
|
+
}
|
|
12
|
+
async getService() {
|
|
13
|
+
await this.ensureLoaded();
|
|
14
|
+
if (!this.service)
|
|
15
|
+
throw new CapabilityError('Upload storage is unavailable.', 'UNAVAILABLE', { reason: 'upload-storage-unavailable' });
|
|
16
|
+
return this.service;
|
|
17
|
+
}
|
|
18
|
+
onDispose() {
|
|
19
|
+
this.service = undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export default UploadStorageClient;
|
|
23
|
+
//# sourceMappingURL=storage-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-client.js","sourceRoot":"","sources":["../../../src/uploads/server/storage-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qFAAqF;AACrF,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IACjD,OAAO,CAAwB;IAEpB,KAAK,CAAC,MAAM;QAC9B,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACxI,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAEkB,SAAS;QAC3B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC1B,CAAC;CACD;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload Storage - Legacy Function Exports
|
|
3
|
+
*
|
|
4
|
+
* Maintains backward compatibility with existing API endpoints.
|
|
5
|
+
*/
|
|
6
|
+
import { type VibesRuntime } from '@vibesdotdev/kernel';
|
|
7
|
+
import { UploadStorageService } from './service.ts';
|
|
8
|
+
import type { UploadOptions, StorageResult } from '../schemas/index.ts';
|
|
9
|
+
/** True when this host's uploads config selects the S3 backend. */
|
|
10
|
+
export declare function isS3Enabled(runtime: VibesRuntime): Promise<boolean>;
|
|
11
|
+
/** Compatibility entrypoint; the kernel owns the client and its initialization lifecycle. */
|
|
12
|
+
export declare function createDefaultService(runtime: VibesRuntime): Promise<UploadStorageService>;
|
|
13
|
+
/**
|
|
14
|
+
* Validates file metadata before saving
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateFile(runtime: VibesRuntime, buffer: Buffer, contentType?: string): Promise<{
|
|
17
|
+
valid: true;
|
|
18
|
+
} | {
|
|
19
|
+
valid: false;
|
|
20
|
+
error: Error;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function saveToStorage(runtime: VibesRuntime, options: UploadOptions): Promise<StorageResult>;
|
|
23
|
+
export declare function getSignedUrl(runtime: VibesRuntime, storagePath: string, expiresSeconds?: number): Promise<string | null>;
|
|
24
|
+
export declare function getPublicUrlFromS3Key(runtime: VibesRuntime, key: string): Promise<string | null>;
|
|
25
|
+
export declare function isLocalPath(runtime: VibesRuntime, storagePath: string): Promise<boolean>;
|
|
26
|
+
export declare function parseS3(runtime: VibesRuntime, storagePath: string): Promise<{
|
|
27
|
+
bucket: string;
|
|
28
|
+
key: string;
|
|
29
|
+
} | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Retrieves file content from storage
|
|
32
|
+
*/
|
|
33
|
+
export declare function getFile(runtime: VibesRuntime, storagePath: string): Promise<Buffer | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Deletes a file from storage
|
|
36
|
+
*/
|
|
37
|
+
export declare function deleteFile(runtime: VibesRuntime, storagePath: string): Promise<boolean>;
|
|
38
|
+
export { UploadStorageService } from './service.ts';
|
|
39
|
+
export { validateUpload, MAX_FILE_SIZE, ALLOWED_MIME_TYPES } from '../schemas/common.ts';
|
|
40
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/uploads/server/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKpD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,mEAAmE;AACnE,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED,6FAA6F;AAC7F,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAG/F;AAED;;GAEG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAE3D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAEzG;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,SAAO,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAItG;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE9F;AAED,wBAAsB,OAAO,CAC5B,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAEjD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEhG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7F;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload Storage - Legacy Function Exports
|
|
3
|
+
*
|
|
4
|
+
* Maintains backward compatibility with existing API endpoints.
|
|
5
|
+
*/
|
|
6
|
+
import {} from '@vibesdotdev/kernel';
|
|
7
|
+
import { UploadStorageService } from "./service.js";
|
|
8
|
+
import { getVibesClient } from '@vibesdotdev/kernel/client';
|
|
9
|
+
import { requireBucket } from "./config.js";
|
|
10
|
+
import { loadUploadsConfig } from "../../config/uploads.js";
|
|
11
|
+
/** True when this host's uploads config selects the S3 backend. */
|
|
12
|
+
export async function isS3Enabled(runtime) {
|
|
13
|
+
return (await loadUploadsConfig(runtime)).backend === 's3';
|
|
14
|
+
}
|
|
15
|
+
/** Compatibility entrypoint; the kernel owns the client and its initialization lifecycle. */
|
|
16
|
+
export async function createDefaultService(runtime) {
|
|
17
|
+
const client = await getVibesClient('uploads-storage', runtime);
|
|
18
|
+
return client.getService();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validates file metadata before saving
|
|
22
|
+
*/
|
|
23
|
+
export async function validateFile(runtime, buffer, contentType) {
|
|
24
|
+
return (await createDefaultService(runtime)).validateFile(buffer, contentType);
|
|
25
|
+
}
|
|
26
|
+
export async function saveToStorage(runtime, options) {
|
|
27
|
+
return (await createDefaultService(runtime)).saveFile(options);
|
|
28
|
+
}
|
|
29
|
+
export async function getSignedUrl(runtime, storagePath, expiresSeconds = 3600) {
|
|
30
|
+
return (await createDefaultService(runtime)).getSignedUrl(storagePath, expiresSeconds);
|
|
31
|
+
}
|
|
32
|
+
export async function getPublicUrlFromS3Key(runtime, key) {
|
|
33
|
+
const uploads = await loadUploadsConfig(runtime);
|
|
34
|
+
const bucket = requireBucket(uploads.s3Bucket);
|
|
35
|
+
return (await createDefaultService(runtime)).getPublicUrl(`s3://${bucket}/${key}`);
|
|
36
|
+
}
|
|
37
|
+
export async function isLocalPath(runtime, storagePath) {
|
|
38
|
+
return (await createDefaultService(runtime)).isLocalPath(storagePath);
|
|
39
|
+
}
|
|
40
|
+
export async function parseS3(runtime, storagePath) {
|
|
41
|
+
return (await createDefaultService(runtime)).parseS3Path(storagePath);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Retrieves file content from storage
|
|
45
|
+
*/
|
|
46
|
+
export async function getFile(runtime, storagePath) {
|
|
47
|
+
return (await createDefaultService(runtime)).getFile(storagePath);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Deletes a file from storage
|
|
51
|
+
*/
|
|
52
|
+
export async function deleteFile(runtime, storagePath) {
|
|
53
|
+
return (await createDefaultService(runtime)).deleteFile(storagePath);
|
|
54
|
+
}
|
|
55
|
+
// Re-export service for new implementations
|
|
56
|
+
export { UploadStorageService } from "./service.js";
|
|
57
|
+
// Re-export validation utilities
|
|
58
|
+
export { validateUpload, MAX_FILE_SIZE, ALLOWED_MIME_TYPES } from "../schemas/common.js";
|
|
59
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/uploads/server/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Plugin
|
|
3
|
+
*
|
|
4
|
+
* Runtime plugin that registers:
|
|
5
|
+
* - uploads/store kind (capability descriptor)
|
|
6
|
+
* - uploads logger + output descriptors
|
|
7
|
+
* - runtime/client 'uploads' registration backed by UploadsClient
|
|
8
|
+
*/
|
|
9
|
+
export declare const uploadsPlugin: import("@vibesdotdev/kernel").RuntimePlugin;
|
|
10
|
+
export default uploadsPlugin;
|
|
11
|
+
//# sourceMappingURL=uploads.plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.plugin.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgEH,eAAO,MAAM,aAAa,6CA0BxB,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Plugin
|
|
3
|
+
*
|
|
4
|
+
* Runtime plugin that registers:
|
|
5
|
+
* - uploads/store kind (capability descriptor)
|
|
6
|
+
* - uploads logger + output descriptors
|
|
7
|
+
* - runtime/client 'uploads' registration backed by UploadsClient
|
|
8
|
+
*/
|
|
9
|
+
import { createRuntimePlugin, loader, createRuntimeAsset } from '@vibesdotdev/kernel';
|
|
10
|
+
import * as z from 'zod/v4';
|
|
11
|
+
import uploadsDocs from "./docs/uploads.docs.descriptor.js";
|
|
12
|
+
import uploadsShareLinksDocs from "./docs/uploads.share-links.docs.descriptor.js";
|
|
13
|
+
import mediaUploadsConfigDescriptor from "../config/media.uploads.config.descriptor.js";
|
|
14
|
+
// Descriptors
|
|
15
|
+
const uploadsStoreDescriptor = createRuntimeAsset({
|
|
16
|
+
id: 'uploads/store',
|
|
17
|
+
kind: 'uploads/store',
|
|
18
|
+
name: 'Uploads Store',
|
|
19
|
+
description: 'File storage backend adapter'
|
|
20
|
+
});
|
|
21
|
+
// Kind definitions - enables runtime.query('uploads/store') to work.
|
|
22
|
+
// Adapters (uploads-adapter-{local,s3,r2}) register descriptors+loaders for
|
|
23
|
+
// this kind via their own plugins; consumers select with withId().
|
|
24
|
+
const uploadsStoreDescriptorSchema = z.object({
|
|
25
|
+
id: z.string(),
|
|
26
|
+
kind: z.literal('uploads/store'),
|
|
27
|
+
name: z.string(),
|
|
28
|
+
description: z.string().optional(),
|
|
29
|
+
tags: z.array(z.string()).optional(),
|
|
30
|
+
hardware: z.array(z.enum(['consumer', 'cloud'])).optional(),
|
|
31
|
+
enabled: z.boolean().default(true)
|
|
32
|
+
});
|
|
33
|
+
const uploadsStoreKind = {
|
|
34
|
+
id: 'uploads/store',
|
|
35
|
+
descriptorSchema: uploadsStoreDescriptorSchema,
|
|
36
|
+
contexts: ['runtime']
|
|
37
|
+
};
|
|
38
|
+
const uploadsLoggerDescriptor = createRuntimeAsset({
|
|
39
|
+
id: 'uploads',
|
|
40
|
+
kind: 'logging/logger',
|
|
41
|
+
name: 'Uploads Logger',
|
|
42
|
+
description: 'Logger for uploads module',
|
|
43
|
+
namespace: 'uploads',
|
|
44
|
+
level: 'info'
|
|
45
|
+
});
|
|
46
|
+
const uploadsOutputDescriptor = createRuntimeAsset({
|
|
47
|
+
id: 'uploads',
|
|
48
|
+
kind: 'logging/output',
|
|
49
|
+
name: 'Uploads Output',
|
|
50
|
+
description: 'Output for uploads logs',
|
|
51
|
+
// `storage` is REQUIRED by OutputDescriptorSchema (no default). Omitting it
|
|
52
|
+
// makes registerPlugin throw at runtime init, which 500s EVERY request of
|
|
53
|
+
// any app composing this plugin (took down account-web prod on 2026-07-15).
|
|
54
|
+
storage: 'file',
|
|
55
|
+
format: 'jsonl',
|
|
56
|
+
path: 'logs/uploads.jsonl'
|
|
57
|
+
});
|
|
58
|
+
const uploadsClientDescriptor = createRuntimeAsset({
|
|
59
|
+
id: 'uploads',
|
|
60
|
+
kind: 'runtime/client',
|
|
61
|
+
name: 'Uploads Client',
|
|
62
|
+
description: 'Canonical client for uploads'
|
|
63
|
+
});
|
|
64
|
+
export const uploadsPlugin = createRuntimePlugin({
|
|
65
|
+
id: 'uploads',
|
|
66
|
+
name: 'Uploads',
|
|
67
|
+
description: 'Runtime-resolved file upload client and storage store kind.',
|
|
68
|
+
dependencies: ['runtime-client'],
|
|
69
|
+
kinds: [uploadsStoreKind],
|
|
70
|
+
descriptors: [
|
|
71
|
+
uploadsStoreDescriptor,
|
|
72
|
+
uploadsLoggerDescriptor,
|
|
73
|
+
uploadsOutputDescriptor,
|
|
74
|
+
uploadsDocs,
|
|
75
|
+
uploadsShareLinksDocs,
|
|
76
|
+
mediaUploadsConfigDescriptor,
|
|
77
|
+
uploadsClientDescriptor,
|
|
78
|
+
createRuntimeAsset({ id: 'uploads.sharing', kind: 'runtime/client', name: 'Sharing Client' }),
|
|
79
|
+
createRuntimeAsset({ id: 'uploads-storage', kind: 'runtime/client', name: 'Upload Storage Client' })
|
|
80
|
+
],
|
|
81
|
+
loaders: [
|
|
82
|
+
// Return the class so AssetAccessor instantiates it with (descriptor, context).
|
|
83
|
+
loader('uploads.sharing', { kind: 'runtime/client' }, () => import('./client/sharing-client.js')),
|
|
84
|
+
loader('uploads', { kind: 'runtime/client' }, () => import('./client/uploads-client.js')),
|
|
85
|
+
loader('uploads-storage', { kind: 'runtime/client' }, () => import('./server/storage-client.js'))
|
|
86
|
+
]
|
|
87
|
+
});
|
|
88
|
+
export default uploadsPlugin;
|
|
89
|
+
//# sourceMappingURL=uploads.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.plugin.js","sourceRoot":"","sources":["../../src/uploads/uploads.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One attempt, captured once as an outcome: the value, or the failure that
|
|
3
|
+
* ended it. The caller reads the failure and decides (branch on its `code` /
|
|
4
|
+
* `reason`, report its value-free facts, or rethrow it); the capture itself
|
|
5
|
+
* never decides, drops or rewrites it.
|
|
6
|
+
*/
|
|
7
|
+
import { type CaughtFailure } from '@vibesdotdev/kernel';
|
|
8
|
+
export type Attempt<T> = {
|
|
9
|
+
readonly ok: true;
|
|
10
|
+
readonly value: T;
|
|
11
|
+
} | {
|
|
12
|
+
readonly ok: false;
|
|
13
|
+
readonly failure: CaughtFailure;
|
|
14
|
+
};
|
|
15
|
+
/** Run `work`; an async failure is the outcome, never thrown. */
|
|
16
|
+
export declare function attempt<T>(work: () => Promise<T>): Promise<Attempt<T>>;
|
|
17
|
+
/** Run `work`; a synchronous failure is the outcome, never thrown. */
|
|
18
|
+
export declare function attemptSync<T>(work: () => T): Attempt<T>;
|
|
19
|
+
/** Throw a captured failure again: the `Error` itself, or the non-Error value that was thrown. */
|
|
20
|
+
export declare function rethrowFailure(failure: CaughtFailure): never;
|
|
21
|
+
/**
|
|
22
|
+
* The failure named by its value-free facts only (`CapabilityError UNAVAILABLE
|
|
23
|
+
* upload-response-invalid`, `Error ENOENT`): safe in a log field or a message,
|
|
24
|
+
* never the failure's own text.
|
|
25
|
+
*/
|
|
26
|
+
export declare function failureLabel(failure: CaughtFailure): string;
|
|
27
|
+
//# sourceMappingURL=attempt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt.d.ts","sourceRoot":"","sources":["../../src/utils/attempt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,MAAM,OAAO,CAAC,CAAC,IAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC;AAE3D,iEAAiE;AACjE,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAM5E;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAMxD;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,KAAK,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAG3D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One attempt, captured once as an outcome: the value, or the failure that
|
|
3
|
+
* ended it. The caller reads the failure and decides (branch on its `code` /
|
|
4
|
+
* `reason`, report its value-free facts, or rethrow it); the capture itself
|
|
5
|
+
* never decides, drops or rewrites it.
|
|
6
|
+
*/
|
|
7
|
+
import { CaughtFailureSchema, valueFreeFailure } from '@vibesdotdev/kernel';
|
|
8
|
+
/** Run `work`; an async failure is the outcome, never thrown. */
|
|
9
|
+
export async function attempt(work) {
|
|
10
|
+
try {
|
|
11
|
+
return { ok: true, value: await work() };
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
return { ok: false, failure: CaughtFailureSchema.parse(error) };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Run `work`; a synchronous failure is the outcome, never thrown. */
|
|
18
|
+
export function attemptSync(work) {
|
|
19
|
+
try {
|
|
20
|
+
return { ok: true, value: work() };
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return { ok: false, failure: CaughtFailureSchema.parse(error) };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Throw a captured failure again: the `Error` itself, or the non-Error value that was thrown. */
|
|
27
|
+
export function rethrowFailure(failure) {
|
|
28
|
+
throw failure instanceof Error ? failure : failure.value;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The failure named by its value-free facts only (`CapabilityError UNAVAILABLE
|
|
32
|
+
* upload-response-invalid`, `Error ENOENT`): safe in a log field or a message,
|
|
33
|
+
* never the failure's own text.
|
|
34
|
+
*/
|
|
35
|
+
export function failureLabel(failure) {
|
|
36
|
+
const facts = valueFreeFailure(failure);
|
|
37
|
+
return [facts.name, facts.code, facts.reason].filter((fact) => fact !== undefined).join(' ');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=attempt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt.js","sourceRoot":"","sources":["../../src/utils/attempt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAMhG,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,IAAsB;IACtD,IAAI,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,CAAC;AACF,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAI,IAAa;IAC3C,IAAI,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,CAAC;AACF,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAAC,OAAsB;IACpD,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IAClD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CaughtFailure } from '@vibesdotdev/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* A message safe to show a user for a failed media call: fixed text chosen by
|
|
4
|
+
* the failure's reason or code, never the failure's own message, which can
|
|
5
|
+
* carry a server's answer or a request value. Anything else is `fallback`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function failureMessage(failure: CaughtFailure, fallback: string): string;
|
|
8
|
+
//# sourceMappingURL=failure-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-message.d.ts","sourceRoot":"","sources":["../../src/utils/failure-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoB5E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG/E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isCapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
/** What a user is told for the refusals they can act on; any other failure gets the caller's fixed fallback. */
|
|
3
|
+
const REASON_MESSAGES = new Map(Object.entries({
|
|
4
|
+
'upload-file-empty': 'That file is empty.',
|
|
5
|
+
'upload-file-too-large': 'That file is too large.',
|
|
6
|
+
'upload-type-not-allowed': 'That file type is not allowed.',
|
|
7
|
+
'upload-size-invalid': 'That file could not be read.',
|
|
8
|
+
'uploads-origin-unresolved': 'Uploads are not available here.',
|
|
9
|
+
'media-capture-provider-unavailable': 'No capture provider is available.',
|
|
10
|
+
'media-capture-result-invalid': 'The capture could not be read.'
|
|
11
|
+
}));
|
|
12
|
+
/** What a user is told by a failure's code when its reason has no message of its own. */
|
|
13
|
+
const CODE_MESSAGES = new Map(Object.entries({
|
|
14
|
+
AUTH_REQUIRED: 'Sign in to continue.',
|
|
15
|
+
PERMISSION_DENIED: 'You do not have permission to do that.',
|
|
16
|
+
RATE_LIMITED: 'Too many requests. Try again shortly.'
|
|
17
|
+
}));
|
|
18
|
+
/**
|
|
19
|
+
* A message safe to show a user for a failed media call: fixed text chosen by
|
|
20
|
+
* the failure's reason or code, never the failure's own message, which can
|
|
21
|
+
* carry a server's answer or a request value. Anything else is `fallback`.
|
|
22
|
+
*/
|
|
23
|
+
export function failureMessage(failure, fallback) {
|
|
24
|
+
if (!isCapabilityError(failure))
|
|
25
|
+
return fallback;
|
|
26
|
+
return REASON_MESSAGES.get(failure.reason) ?? CODE_MESSAGES.get(failure.code) ?? fallback;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=failure-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-message.js","sourceRoot":"","sources":["../../src/utils/failure-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,qBAAqB,CAAC;AAE5E,gHAAgH;AAChH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC;IAC9D,mBAAmB,EAAE,qBAAqB;IAC1C,uBAAuB,EAAE,yBAAyB;IAClD,yBAAyB,EAAE,gCAAgC;IAC3D,qBAAqB,EAAE,8BAA8B;IACrD,2BAA2B,EAAE,iCAAiC;IAC9D,oCAAoC,EAAE,mCAAmC;IACzE,8BAA8B,EAAE,gCAAgC;CAChE,CAAC,CAAC,CAAC;AAEJ,yFAAyF;AACzF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC;IAC5D,aAAa,EAAE,sBAAsB;IACrC,iBAAiB,EAAE,wCAAwC;IAC3D,YAAY,EAAE,uCAAuC;CACrD,CAAC,CAAC,CAAC;AAEJ;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsB,EAAE,QAAgB;IACtE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;AAC3F,CAAC"}
|