@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,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Upload Storage Implementation
|
|
3
|
+
*
|
|
4
|
+
* Filesystem-based storage adapter for the uploads/store kind.
|
|
5
|
+
*
|
|
6
|
+
* It reaches the disk only through the runtime's filesystem kind and paths
|
|
7
|
+
* capability, handed in as `host`: the adapter imports no Node module. Every
|
|
8
|
+
* storage path is resolved against the root and must stay inside it, the file
|
|
9
|
+
* extension is allowlisted, and the upload kind maps exactly.
|
|
10
|
+
*/
|
|
11
|
+
import * as z from 'zod/v4';
|
|
12
|
+
import { CapabilityError, isCapabilityError } from '@vibesdotdev/kernel';
|
|
13
|
+
import { resolveExtensionFromMimeType, uploadKindSchema, uploadStorageOptionsSchema } from "../../schemas/common.js";
|
|
14
|
+
import { parseRequest } from "../../schemas/requests.js";
|
|
15
|
+
import { attempt, rethrowFailure } from "../../../utils/attempt.js";
|
|
16
|
+
/**
|
|
17
|
+
* Default configuration for local storage
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_CONFIG = {
|
|
20
|
+
backend: 'local',
|
|
21
|
+
localPath: 'uploads'
|
|
22
|
+
};
|
|
23
|
+
/** The subdirectory each upload kind is stored under; `document` shares `media`. */
|
|
24
|
+
const KIND_DIRECTORIES = {
|
|
25
|
+
chat: 'chat',
|
|
26
|
+
avatar: 'avatars',
|
|
27
|
+
media: 'media',
|
|
28
|
+
document: 'media'
|
|
29
|
+
};
|
|
30
|
+
/** A file extension taken from a caller's name: short, lower-case letters and digits only. */
|
|
31
|
+
const SafeExtensionSchema = z.string().regex(/^[a-z0-9]{1,10}$/);
|
|
32
|
+
const BytesSchema = z.instanceof(Uint8Array);
|
|
33
|
+
/** Whether a read or remove failure only says "there is no such file". */
|
|
34
|
+
function isAbsent(failure) {
|
|
35
|
+
if (isCapabilityError(failure))
|
|
36
|
+
return failure.code === 'NOT_FOUND';
|
|
37
|
+
return z.object({ code: z.literal('ENOENT') }).safeParse(failure).success;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Local filesystem upload storage adapter.
|
|
41
|
+
* Provides save/get/delete operations for file storage on the local filesystem.
|
|
42
|
+
*/
|
|
43
|
+
export class LocalStorageService {
|
|
44
|
+
host;
|
|
45
|
+
config;
|
|
46
|
+
resolvedBasePath;
|
|
47
|
+
/**
|
|
48
|
+
* Create a local storage service.
|
|
49
|
+
*
|
|
50
|
+
* @param config - Partial storage configuration (localPath, etc.)
|
|
51
|
+
* @param workspaceRoot - The bound workspace root (`runtime/workspace-path`);
|
|
52
|
+
* a relative `localPath` resolves against it, never the process cwd.
|
|
53
|
+
* @param host - The runtime's filesystem kind and paths capability.
|
|
54
|
+
*/
|
|
55
|
+
constructor(config, workspaceRoot, host) {
|
|
56
|
+
this.host = host;
|
|
57
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
58
|
+
const basePath = this.config.localPath || 'uploads';
|
|
59
|
+
if (host.path.isAbsolute(basePath)) {
|
|
60
|
+
this.resolvedBasePath = basePath;
|
|
61
|
+
}
|
|
62
|
+
else if (workspaceRoot) {
|
|
63
|
+
this.resolvedBasePath = host.path.join(workspaceRoot, basePath);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new CapabilityError('This host is bound to no workspace.', 'NOT_FOUND', {
|
|
67
|
+
reason: 'workspace-unbound',
|
|
68
|
+
recoveryHint: 'Configure an absolute uploads localPath, or bind a workspace.'
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Save a file to local storage.
|
|
74
|
+
*
|
|
75
|
+
* @param options - Upload options including buffer, kind, userId, etc.
|
|
76
|
+
* @returns StorageResult with storagePath, size, and backend
|
|
77
|
+
*/
|
|
78
|
+
async save(input) {
|
|
79
|
+
const parsed = parseRequest(uploadStorageOptionsSchema, input);
|
|
80
|
+
if (!parsed.success) {
|
|
81
|
+
throw new CapabilityError('The storage upload request is invalid.', 'INVALID_INPUT', {
|
|
82
|
+
reason: parsed.field === 'kind' ? 'storage-kind-unknown' : 'upload-options-invalid'
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const options = parsed.data;
|
|
86
|
+
const kindPath = this.getKindPath(options.kind);
|
|
87
|
+
const ext = this.getFileExtension(options.originalName, options.contentType);
|
|
88
|
+
const id = crypto.randomUUID();
|
|
89
|
+
const basePath = this.config.localPath || 'uploads';
|
|
90
|
+
const fullDir = this.host.path.join(this.resolvedBasePath, kindPath);
|
|
91
|
+
await this.host.files.mkdir(fullDir, { recursive: true });
|
|
92
|
+
const fileName = `${id}.${ext}`;
|
|
93
|
+
await this.host.files.writeFile(this.host.path.join(fullDir, fileName), options.buffer);
|
|
94
|
+
// storagePath reflects the logical path (preserving original basePath for API consumers)
|
|
95
|
+
const storagePath = `/${[basePath, kindPath, fileName].join('/')}`;
|
|
96
|
+
return {
|
|
97
|
+
storagePath,
|
|
98
|
+
size: options.buffer.length,
|
|
99
|
+
backend: 'local'
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get a file from local storage.
|
|
104
|
+
*
|
|
105
|
+
* @param storagePath - The storage path (e.g., /uploads/media/abc.png)
|
|
106
|
+
* @returns Buffer containing file data, or null if file not found
|
|
107
|
+
* @throws `storage-path-outside-root` when the path leaves the storage root
|
|
108
|
+
*/
|
|
109
|
+
async get(storagePath) {
|
|
110
|
+
const fullPath = this.confinedPath(storagePath);
|
|
111
|
+
const read = await attempt(() => this.host.files.readFile(fullPath));
|
|
112
|
+
if (read.ok)
|
|
113
|
+
return Buffer.from(BytesSchema.parse(read.value));
|
|
114
|
+
if (isAbsent(read.failure))
|
|
115
|
+
return null;
|
|
116
|
+
return rethrowFailure(read.failure);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Delete a file from local storage.
|
|
120
|
+
*
|
|
121
|
+
* @param storagePath - The storage path (e.g., /uploads/media/abc.png)
|
|
122
|
+
* @returns true if deleted successfully, false when there was no such file
|
|
123
|
+
* @throws `storage-path-outside-root` when the path leaves the storage root
|
|
124
|
+
*/
|
|
125
|
+
async delete(storagePath) {
|
|
126
|
+
const fullPath = this.confinedPath(storagePath);
|
|
127
|
+
const removed = await attempt(() => this.host.files.remove(fullPath));
|
|
128
|
+
if (removed.ok)
|
|
129
|
+
return true;
|
|
130
|
+
if (isAbsent(removed.failure))
|
|
131
|
+
return false;
|
|
132
|
+
return rethrowFailure(removed.failure);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get a public URL for a local file.
|
|
136
|
+
*
|
|
137
|
+
* @param storagePath - The storage path
|
|
138
|
+
* @returns The public URL (for local, returns the path itself if it starts with /uploads/), or null if invalid
|
|
139
|
+
*/
|
|
140
|
+
getPublicUrl(storagePath) {
|
|
141
|
+
if (storagePath.startsWith('/uploads/') && !storagePath.split('/').includes('..')) {
|
|
142
|
+
return storagePath;
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get a signed URL for temporary access.
|
|
148
|
+
*
|
|
149
|
+
* For local storage, this always returns null as local files
|
|
150
|
+
* are accessed directly via their public path.
|
|
151
|
+
*
|
|
152
|
+
* @param _storagePath - The storage path (ignored for local)
|
|
153
|
+
* @param _expiresSeconds - Expiration time in seconds (ignored for local)
|
|
154
|
+
* @returns null (local storage does not support signed URLs)
|
|
155
|
+
*/
|
|
156
|
+
getSignedUrl(_storagePath, _expiresSeconds) {
|
|
157
|
+
return Promise.resolve(null);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if a storage path is a local path.
|
|
161
|
+
*
|
|
162
|
+
* @param storagePath - The storage path to check
|
|
163
|
+
* @returns true if the path starts with /uploads/
|
|
164
|
+
*/
|
|
165
|
+
isLocalPath(storagePath) {
|
|
166
|
+
return storagePath.startsWith('/uploads/');
|
|
167
|
+
}
|
|
168
|
+
// Private helper methods
|
|
169
|
+
/**
|
|
170
|
+
* The subdirectory for an upload kind; a kind that is not one of the known
|
|
171
|
+
* kinds is refused, never stored under a default.
|
|
172
|
+
*/
|
|
173
|
+
getKindPath(kind) {
|
|
174
|
+
const known = uploadKindSchema.safeParse(kind);
|
|
175
|
+
if (!known.success) {
|
|
176
|
+
throw new CapabilityError('The upload kind is not one of the known kinds.', 'INVALID_INPUT', {
|
|
177
|
+
reason: 'storage-kind-unknown',
|
|
178
|
+
retryable: false
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return KIND_DIRECTORIES[known.data];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The extension of a stored file: the caller's own extension when it is
|
|
185
|
+
* short, lower-case letters and digits only; else the MIME type's; else `bin`.
|
|
186
|
+
* Nothing from the name but that extension reaches the path.
|
|
187
|
+
*/
|
|
188
|
+
getFileExtension(originalName, contentType) {
|
|
189
|
+
const named = originalName?.includes('.') ? originalName.split('.').pop() : undefined;
|
|
190
|
+
const safe = SafeExtensionSchema.safeParse(named?.toLowerCase());
|
|
191
|
+
if (safe.success)
|
|
192
|
+
return safe.data;
|
|
193
|
+
return resolveExtensionFromMimeType(contentType) ?? 'bin';
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Resolve a storage path against the storage root, refusing one that leaves it.
|
|
197
|
+
* Converts /uploads/media/file.png -> <root>/media/file.png.
|
|
198
|
+
* Handles both absolute storage paths and relative paths.
|
|
199
|
+
*/
|
|
200
|
+
confinedPath(storagePath) {
|
|
201
|
+
const { path } = this.host;
|
|
202
|
+
// Remove leading slash if present
|
|
203
|
+
const cleanPath = storagePath.startsWith('/') ? storagePath.slice(1) : storagePath;
|
|
204
|
+
const basePath = this.config.localPath || 'uploads';
|
|
205
|
+
// A path under the logical base (e.g. "uploads/media/file.png") loses the base prefix; otherwise it is already relative.
|
|
206
|
+
const relativePath = cleanPath.startsWith(`${basePath}/`) ? cleanPath.slice(basePath.length + 1) : cleanPath;
|
|
207
|
+
const resolved = path.resolve(this.resolvedBasePath, relativePath);
|
|
208
|
+
const within = path.relative(this.resolvedBasePath, resolved);
|
|
209
|
+
if (within === '' || within.startsWith('..') || path.isAbsolute(within)) {
|
|
210
|
+
throw new CapabilityError('The storage path is outside the storage root.', 'INVALID_INPUT', {
|
|
211
|
+
reason: 'storage-path-outside-root',
|
|
212
|
+
retryable: false
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return resolved;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Create a local storage service instance.
|
|
220
|
+
*
|
|
221
|
+
* @param config - Optional storage configuration
|
|
222
|
+
* @param workspaceRoot - The bound workspace root, for a relative `localPath`
|
|
223
|
+
* @param host - The runtime's filesystem kind and paths capability
|
|
224
|
+
* @returns LocalStorageService instance
|
|
225
|
+
*/
|
|
226
|
+
export function createLocalStorageService(config, workspaceRoot, host) {
|
|
227
|
+
return new LocalStorageService(config, workspaceRoot, host);
|
|
228
|
+
}
|
|
229
|
+
// Default export for the implementation
|
|
230
|
+
export default LocalStorageService;
|
|
231
|
+
//# sourceMappingURL=local-storage.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-storage.impl.js","sourceRoot":"","sources":["../../../../src/uploads/adapters/local/local-storage.impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Adapter Local Plugin
|
|
3
|
+
*
|
|
4
|
+
* Runtime plugin that registers the local filesystem storage adapter
|
|
5
|
+
* for the uploads/store kind. Suitable for consumer hardware targets.
|
|
6
|
+
*/
|
|
7
|
+
export declare const uploadsAdapterLocalPlugin: import("@vibesdotdev/kernel").RuntimePlugin;
|
|
8
|
+
export default uploadsAdapterLocalPlugin;
|
|
9
|
+
//# sourceMappingURL=uploads-adapter-local.plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads-adapter-local.plugin.d.ts","sourceRoot":"","sources":["../../../../src/uploads/adapters/local/uploads-adapter-local.plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,eAAO,MAAM,yBAAyB,6CA8BpC,CAAC;AAEH,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Adapter Local Plugin
|
|
3
|
+
*
|
|
4
|
+
* Runtime plugin that registers the local filesystem storage adapter
|
|
5
|
+
* for the uploads/store kind. Suitable for consumer hardware targets.
|
|
6
|
+
*/
|
|
7
|
+
import { createRuntimePlugin } from '@vibesdotdev/kernel';
|
|
8
|
+
import { getRuntimePath } from '@vibesdotdev/paths';
|
|
9
|
+
import { resolveFileSystemAdapter } from '@vibesdotdev/filesystem/client/resolve-adapter';
|
|
10
|
+
import { loadUploadsConfig } from "../../../config/uploads.js";
|
|
11
|
+
import localStorageDescriptor from "./local-storage.descriptor.js";
|
|
12
|
+
export const uploadsAdapterLocalPlugin = createRuntimePlugin({
|
|
13
|
+
id: '@vibesdotdev/media/uploads/adapters/local',
|
|
14
|
+
name: 'Uploads Adapter Local',
|
|
15
|
+
description: 'Local filesystem storage adapter for uploads. Consumer hardware only.',
|
|
16
|
+
dependencies: ['uploads'],
|
|
17
|
+
descriptors: [localStorageDescriptor],
|
|
18
|
+
onRegister: async (runtime) => {
|
|
19
|
+
// Register the local storage descriptor (required for runtime.query matching)
|
|
20
|
+
runtime.registerDescriptor('uploads/store', localStorageDescriptor);
|
|
21
|
+
// Register the local storage loader - creates storage instances per scope
|
|
22
|
+
runtime.registerLoader('uploads/store', localStorageDescriptor.id, async () => {
|
|
23
|
+
const { LocalStorageService } = await import('./local-storage.impl.js');
|
|
24
|
+
// The default relative `uploads` directory lives in the bound workspace.
|
|
25
|
+
const workspaceRoot = await runtime.context('runtime/workspace-path');
|
|
26
|
+
// The disk is reached through the runtime's filesystem kind (unbound: absolute host paths) and paths capability.
|
|
27
|
+
const files = await resolveFileSystemAdapter(runtime, { binding: false });
|
|
28
|
+
const path = await getRuntimePath(runtime);
|
|
29
|
+
// Runtime-owned configuration: the configured uploads root flows from the
|
|
30
|
+
// `media.uploads` manifest through every adapter the runtime resolves.
|
|
31
|
+
const uploads = await loadUploadsConfig(runtime);
|
|
32
|
+
return { impl: new LocalStorageService({ backend: 'local', localPath: uploads.localPath }, workspaceRoot, { files, path }) };
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
onDispose: async () => {
|
|
36
|
+
// Cleanup is handled at the individual file level
|
|
37
|
+
// No global state to clean up for local file storage
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
export default uploadsAdapterLocalPlugin;
|
|
41
|
+
//# sourceMappingURL=uploads-adapter-local.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads-adapter-local.plugin.js","sourceRoot":"","sources":["../../../../src/uploads/adapters/local/uploads-adapter-local.plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,sBAAsB,MAAM,+BAA+B,CAAC;AAEnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;IAC5D,EAAE,EAAE,2CAA2C;IAC/C,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,uEAAuE;IACpF,YAAY,EAAE,CAAC,SAAS,CAAC;IAEzB,WAAW,EAAE,CAAC,sBAAsB,CAAC;IAErC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC7B,8EAA8E;QAC9E,OAAO,CAAC,kBAAkB,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;QACpE,0EAA0E;QAC1E,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,sBAAsB,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACxE,yEAAyE;YACzE,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,OAAO,CAAS,wBAAwB,CAAC,CAAC;YAC9E,iHAAiH;YACjH,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAC3C,0EAA0E;YAC1E,uEAAuE;YACvE,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9H,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,SAAS,EAAE,KAAK,IAAI,EAAE;QACrB,kDAAkD;QAClD,qDAAqD;IACtD,CAAC;CACD,CAAC,CAAC;AAEH,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Client Helper
|
|
3
|
+
*
|
|
4
|
+
* Provides the canonical getVibesUploadsClient(runtime) entry point.
|
|
5
|
+
*/
|
|
6
|
+
import type { VibesRuntime } from '@vibesdotdev/kernel';
|
|
7
|
+
import type { UploadsClient } from './uploads-client.ts';
|
|
8
|
+
/**
|
|
9
|
+
* Get the runtime-resolved uploads client.
|
|
10
|
+
*
|
|
11
|
+
* Cross-app upload access goes through this function — never raw fetch
|
|
12
|
+
* against platform-web, never new UploadStorageService().
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const uploads = await getVibesUploadsClient(runtime);
|
|
17
|
+
* const result = await uploads.upload({
|
|
18
|
+
* file,
|
|
19
|
+
* kind: 'avatar',
|
|
20
|
+
* sourceApp: 'account',
|
|
21
|
+
* sourceId: userId
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function getVibesUploadsClient(runtime: VibesRuntime): Promise<UploadsClient>;
|
|
26
|
+
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../src/uploads/client/helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAEzF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Client Helper
|
|
3
|
+
*
|
|
4
|
+
* Provides the canonical getVibesUploadsClient(runtime) entry point.
|
|
5
|
+
*/
|
|
6
|
+
import { getVibesClient } from '@vibesdotdev/kernel/client';
|
|
7
|
+
/**
|
|
8
|
+
* Get the runtime-resolved uploads client.
|
|
9
|
+
*
|
|
10
|
+
* Cross-app upload access goes through this function — never raw fetch
|
|
11
|
+
* against platform-web, never new UploadStorageService().
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const uploads = await getVibesUploadsClient(runtime);
|
|
16
|
+
* const result = await uploads.upload({
|
|
17
|
+
* file,
|
|
18
|
+
* kind: 'avatar',
|
|
19
|
+
* sourceApp: 'account',
|
|
20
|
+
* sourceId: userId
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export async function getVibesUploadsClient(runtime) {
|
|
25
|
+
return getVibesClient('uploads', runtime);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/uploads/client/helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAqB;IAChE,OAAO,cAAc,CAAgB,SAAS,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Client
|
|
3
|
+
*
|
|
4
|
+
* Runtime-resolved client for file uploads. Communicates with platform-web's
|
|
5
|
+
* storage endpoints to upload, list, and manage files.
|
|
6
|
+
*/
|
|
7
|
+
export { UploadsClient, createUploadsClient } from './uploads-client.ts';
|
|
8
|
+
export { getVibesUploadsClient } from './helper.ts';
|
|
9
|
+
export type { UploadResult, FileRecord, StorageUsageResult } from './uploads-client.ts';
|
|
10
|
+
export type { ShareLink, CreateShareLinkOptions } from '../schemas/shares.ts';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/uploads/client/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxF,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uploads Client
|
|
3
|
+
*
|
|
4
|
+
* Runtime-resolved client for file uploads. Communicates with platform-web's
|
|
5
|
+
* storage endpoints to upload, list, and manage files.
|
|
6
|
+
*/
|
|
7
|
+
export { UploadsClient, createUploadsClient } from "./uploads-client.js";
|
|
8
|
+
export { getVibesUploadsClient } from "./helper.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/uploads/client/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
2
|
+
import { type VibesRuntime } from '@vibesdotdev/kernel';
|
|
3
|
+
import type { ShareLink, CreateShareLinkOptions } from '../schemas/shares.ts';
|
|
4
|
+
import { type SharingEntry as PerFileEntry, type SharingSnapshot } from '../../schemas/sharing-state.ts';
|
|
5
|
+
/** Runtime-owned share observations; projections own their subscriptions. */
|
|
6
|
+
export declare class SharingClient extends BaseRuntimeClient<VibesRuntime> {
|
|
7
|
+
/** Per-fileId share-link entries. */
|
|
8
|
+
private entries;
|
|
9
|
+
private closed;
|
|
10
|
+
private readonly listeners;
|
|
11
|
+
private readonly close;
|
|
12
|
+
get snapshot(): SharingSnapshot;
|
|
13
|
+
subscribe(listener: (snapshot: SharingSnapshot) => void): () => void;
|
|
14
|
+
private client;
|
|
15
|
+
private inflight;
|
|
16
|
+
/** Read the entry for a fileId (always defined; defaults to empty). */
|
|
17
|
+
entry(fileId: string): PerFileEntry;
|
|
18
|
+
links(fileId: string): ShareLink[];
|
|
19
|
+
isLoading(fileId: string): boolean;
|
|
20
|
+
error(fileId: string): string | null;
|
|
21
|
+
private setEntry;
|
|
22
|
+
/**
|
|
23
|
+
* Idempotent per-fileId init: load existing share links. Concurrent callers
|
|
24
|
+
* for the same fileId share the in-flight promise. Safe to call from a
|
|
25
|
+
* loader mount on every render.
|
|
26
|
+
*/
|
|
27
|
+
init(fileId: string): Promise<void>;
|
|
28
|
+
/** Force a re-fetch of a file's links regardless of loaded state. */
|
|
29
|
+
refresh(fileId: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Create a new share link for a file and prepend it to local state. Throws
|
|
32
|
+
* on the underlying client error so callers can surface a toast.
|
|
33
|
+
*/
|
|
34
|
+
create(fileId: string, options?: CreateShareLinkOptions): Promise<ShareLink>;
|
|
35
|
+
/**
|
|
36
|
+
* Revoke a share link. Updates local state optimistically; on failure the
|
|
37
|
+
* previous state is restored and the error is re-thrown.
|
|
38
|
+
*/
|
|
39
|
+
revoke(fileId: string, shareId: string): Promise<boolean>;
|
|
40
|
+
protected onDispose(): void;
|
|
41
|
+
private resolveClient;
|
|
42
|
+
private assertOpen;
|
|
43
|
+
}
|
|
44
|
+
export default SharingClient;
|
|
45
|
+
//# sourceMappingURL=sharing-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharing-client.d.ts","sourceRoot":"","sources":["../../../src/uploads/client/sharing-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIzE,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAmC,KAAK,YAAY,IAAI,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAI1I,6EAA6E;AAC7E,qBAAa,aAAc,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IACjE,qCAAqC;IACrC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;IAC5E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAEhD,IAAI,QAAQ,IAAI,eAAe,CAAyB;IAExD,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAQpE,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAAoC;IAEpD,uEAAuE;IACvE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAInC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAIlC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIpC,OAAO,CAAC,QAAQ;IAOhB;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BzC,qEAAqE;IAC/D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,SAAS,CAAC;IAStF;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAqB5C,SAAS,IAAI,IAAI;YAWtB,aAAa;IAU3B,OAAO,CAAC,UAAU;CAKlB;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
2
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
3
|
+
import { getLogger } from '@vibesdotdev/logging';
|
|
4
|
+
import { getVibesUploadsClient } from "./helper.js";
|
|
5
|
+
import { emptySharingEntry as emptyEntry } from "../../schemas/sharing-state.js";
|
|
6
|
+
import { attempt, failureLabel } from "../../utils/attempt.js";
|
|
7
|
+
import { failureMessage } from "../../utils/failure-message.js";
|
|
8
|
+
/** Runtime-owned share observations; projections own their subscriptions. */
|
|
9
|
+
export class SharingClient extends BaseRuntimeClient {
|
|
10
|
+
/** Per-fileId share-link entries. */
|
|
11
|
+
entries = {};
|
|
12
|
+
closed = false;
|
|
13
|
+
listeners = new Set();
|
|
14
|
+
close = () => this.onDispose();
|
|
15
|
+
get snapshot() { return this.entries; }
|
|
16
|
+
subscribe(listener) {
|
|
17
|
+
if (this.closed) {
|
|
18
|
+
listener({});
|
|
19
|
+
return () => { };
|
|
20
|
+
}
|
|
21
|
+
this.runtime.lifecycle.signal.addEventListener('abort', this.close, { once: true });
|
|
22
|
+
this.listeners.add(listener);
|
|
23
|
+
listener(this.entries);
|
|
24
|
+
return () => this.listeners.delete(listener);
|
|
25
|
+
}
|
|
26
|
+
client = null;
|
|
27
|
+
inflight = new Map();
|
|
28
|
+
/** Read the entry for a fileId (always defined; defaults to empty). */
|
|
29
|
+
entry(fileId) {
|
|
30
|
+
return this.entries[fileId] ?? emptyEntry();
|
|
31
|
+
}
|
|
32
|
+
links(fileId) {
|
|
33
|
+
return this.entry(fileId).links;
|
|
34
|
+
}
|
|
35
|
+
isLoading(fileId) {
|
|
36
|
+
return this.entry(fileId).loading;
|
|
37
|
+
}
|
|
38
|
+
error(fileId) {
|
|
39
|
+
return this.entry(fileId).error;
|
|
40
|
+
}
|
|
41
|
+
setEntry(fileId, patch) {
|
|
42
|
+
if (this.closed || this.runtime.lifecycle.signal.aborted)
|
|
43
|
+
return;
|
|
44
|
+
const current = this.entries[fileId] ?? emptyEntry();
|
|
45
|
+
this.entries = { ...this.entries, [fileId]: { ...current, ...patch } };
|
|
46
|
+
for (const listener of this.listeners)
|
|
47
|
+
listener(this.entries);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Idempotent per-fileId init: load existing share links. Concurrent callers
|
|
51
|
+
* for the same fileId share the in-flight promise. Safe to call from a
|
|
52
|
+
* loader mount on every render.
|
|
53
|
+
*/
|
|
54
|
+
async init(fileId) {
|
|
55
|
+
if (!fileId || this.closed)
|
|
56
|
+
return;
|
|
57
|
+
if (this.entry(fileId).loaded)
|
|
58
|
+
return;
|
|
59
|
+
const existing = this.inflight.get(fileId);
|
|
60
|
+
if (existing) {
|
|
61
|
+
await existing;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.setEntry(fileId, { loading: true, error: null });
|
|
65
|
+
const promise = (async () => {
|
|
66
|
+
const loaded = await attempt(async () => (await this.resolveClient()).listShareLinks(fileId));
|
|
67
|
+
if (this.closed)
|
|
68
|
+
return;
|
|
69
|
+
if (loaded.ok) {
|
|
70
|
+
this.setEntry(fileId, { links: loaded.value, loaded: true });
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// A fixed message for the UI; the failure's class and reason go to the log, never its text.
|
|
74
|
+
getLogger('uploads', this.runtime).warn('sharing state: share links did not load', { failure: failureLabel(loaded.failure) });
|
|
75
|
+
this.setEntry(fileId, {
|
|
76
|
+
error: failureMessage(loaded.failure, 'Could not load share links.'),
|
|
77
|
+
loaded: true
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
this.setEntry(fileId, { loading: false });
|
|
81
|
+
this.inflight.delete(fileId);
|
|
82
|
+
})();
|
|
83
|
+
this.inflight.set(fileId, promise);
|
|
84
|
+
await promise;
|
|
85
|
+
}
|
|
86
|
+
/** Force a re-fetch of a file's links regardless of loaded state. */
|
|
87
|
+
async refresh(fileId) {
|
|
88
|
+
this.setEntry(fileId, { loaded: false });
|
|
89
|
+
await this.init(fileId);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a new share link for a file and prepend it to local state. Throws
|
|
93
|
+
* on the underlying client error so callers can surface a toast.
|
|
94
|
+
*/
|
|
95
|
+
async create(fileId, options = {}) {
|
|
96
|
+
const client = await this.resolveClient();
|
|
97
|
+
this.setEntry(fileId, { error: null });
|
|
98
|
+
const link = await client.createShareLink(fileId, options);
|
|
99
|
+
const current = this.entry(fileId);
|
|
100
|
+
this.setEntry(fileId, { links: [link, ...current.links], loaded: true });
|
|
101
|
+
return link;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Revoke a share link. Updates local state optimistically; on failure the
|
|
105
|
+
* previous state is restored and the error is re-thrown.
|
|
106
|
+
*/
|
|
107
|
+
async revoke(fileId, shareId) {
|
|
108
|
+
const client = await this.resolveClient();
|
|
109
|
+
const previous = this.entry(fileId).links;
|
|
110
|
+
// Optimistic: mark revoked locally.
|
|
111
|
+
this.setEntry(fileId, {
|
|
112
|
+
links: previous.map((l) => l.id === shareId ? { ...l, revokedAt: new Date().toISOString() } : l)
|
|
113
|
+
});
|
|
114
|
+
try {
|
|
115
|
+
const ok = await client.revokeShareLink(fileId, shareId);
|
|
116
|
+
if (!ok) {
|
|
117
|
+
this.setEntry(fileId, { links: previous });
|
|
118
|
+
}
|
|
119
|
+
return ok;
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
this.setEntry(fileId, { links: previous });
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
onDispose() {
|
|
127
|
+
if (this.closed)
|
|
128
|
+
return;
|
|
129
|
+
this.closed = true;
|
|
130
|
+
this.runtime.lifecycle.signal.removeEventListener('abort', this.close);
|
|
131
|
+
this.entries = {};
|
|
132
|
+
this.client = null;
|
|
133
|
+
this.inflight.clear();
|
|
134
|
+
for (const listener of this.listeners)
|
|
135
|
+
listener(this.entries);
|
|
136
|
+
this.listeners.clear();
|
|
137
|
+
}
|
|
138
|
+
async resolveClient() {
|
|
139
|
+
this.assertOpen();
|
|
140
|
+
this.runtime.lifecycle.signal.addEventListener('abort', this.close, { once: true });
|
|
141
|
+
const client = this.client ?? await getVibesUploadsClient(this.runtime);
|
|
142
|
+
await client.ensureLoaded();
|
|
143
|
+
this.assertOpen();
|
|
144
|
+
this.client = client;
|
|
145
|
+
return client;
|
|
146
|
+
}
|
|
147
|
+
assertOpen() {
|
|
148
|
+
if (this.closed || this.runtime.lifecycle.signal.aborted)
|
|
149
|
+
throw new CapabilityError('Sharing state is disposed.', 'UNAVAILABLE', { reason: 'sharing-state-disposed', retryable: false });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export default SharingClient;
|
|
153
|
+
//# sourceMappingURL=sharing-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharing-client.js","sourceRoot":"","sources":["../../../src/uploads/client/sharing-client.ts"],"names":[],"mappings":"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"}
|