motion-canvas-cache 0.1.0

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.
@@ -0,0 +1,164 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+
4
+ function motionCanvasCachePlugin(options = {}) {
5
+ const { cachePath = 'motion-canvas-cache', maxFileSize = 50, // 50MB default
6
+ } = options;
7
+ return {
8
+ name: 'motion-canvas-cache:file-storage',
9
+ configureServer(server) {
10
+ // Ensure cache directory exists
11
+ if (!fs.existsSync(cachePath)) {
12
+ fs.mkdirSync(cachePath, { recursive: true });
13
+ }
14
+ // WebSocket handler for file uploads
15
+ server.ws.on('cache:upload-file', async (message, client) => {
16
+ try {
17
+ const { data, mimeType, cacheKey, metadata } = message;
18
+ // Validate file size
19
+ const base64Data = data.slice(data.indexOf(',') + 1);
20
+ const bufferData = Buffer.from(base64Data, 'base64');
21
+ const fileSizeMB = bufferData.length / (1024 * 1024);
22
+ if (fileSizeMB > maxFileSize) {
23
+ client.send('cache:upload-error', {
24
+ error: `File too large: ${fileSizeMB.toFixed(2)}MB (max: ${maxFileSize}MB)`,
25
+ cacheKey,
26
+ });
27
+ return;
28
+ }
29
+ // Generate file extension from mime type
30
+ const extension = getExtensionFromMimeType(mimeType);
31
+ // Create file path using cache key as filename
32
+ const fileName = `${cacheKey}.${extension}`;
33
+ const filePath = path.join(cachePath, fileName);
34
+ // Write file
35
+ await writeFile(filePath, bufferData);
36
+ // Create metadata file
37
+ const metadataPath = path.join(cachePath, `${cacheKey}.meta.json`);
38
+ const metadataContent = {
39
+ cacheKey,
40
+ mimeType,
41
+ fileSize: bufferData.length,
42
+ fileName,
43
+ createdAt: new Date().toISOString(),
44
+ ...metadata,
45
+ };
46
+ await fs.promises.writeFile(metadataPath, JSON.stringify(metadataContent, null, 2));
47
+ // Send success response
48
+ client.send('cache:upload-success', {
49
+ cacheKey,
50
+ filePath: '/' + filePath,
51
+ metadata: metadataContent,
52
+ size: bufferData.length,
53
+ });
54
+ console.log(`File cached: ${filePath} (${fileSizeMB.toFixed(2)}MB)`);
55
+ }
56
+ catch (error) {
57
+ console.error('File upload error:', error);
58
+ client.send('cache:upload-error', {
59
+ error: error instanceof Error ? error.message : 'Unknown error',
60
+ cacheKey: message.cacheKey,
61
+ });
62
+ }
63
+ });
64
+ // WebSocket handler for checking if plugin is available
65
+ server.ws.on('cache:check-available', (message, client) => {
66
+ client.send('cache:available', {});
67
+ });
68
+ // WebSocket handler for checking if file exists
69
+ server.ws.on('cache:check-file', async (message, client) => {
70
+ try {
71
+ const { cacheKey } = message;
72
+ const metadataPath = path.join(cachePath, `${cacheKey}.meta.json`);
73
+ // First check if metadata exists
74
+ if (fs.existsSync(metadataPath)) {
75
+ const metadata = JSON.parse(await fs.promises.readFile(metadataPath, 'utf8'));
76
+ // Then check if the actual file exists
77
+ const fileName = metadata.fileName || `${cacheKey}.bin`;
78
+ const filePath = path.join(cachePath, fileName);
79
+ if (fs.existsSync(filePath)) {
80
+ client.send('cache:file-exists', {
81
+ cacheKey,
82
+ filePath: '/' + filePath,
83
+ metadata,
84
+ });
85
+ return;
86
+ }
87
+ }
88
+ // File not found
89
+ client.send('cache:file-not-found', { cacheKey });
90
+ }
91
+ catch (error) {
92
+ console.error('File check error:', error);
93
+ client.send('cache:file-not-found', {
94
+ cacheKey: message.cacheKey,
95
+ });
96
+ }
97
+ });
98
+ // Optional cleanup endpoint
99
+ server.middlewares.use('/__cache-cleanup', async (req, res) => {
100
+ try {
101
+ if (!fs.existsSync(cachePath)) {
102
+ res.writeHead(200, { 'Content-Type': 'application/json' });
103
+ res.end(JSON.stringify({ message: 'Cache directory does not exist' }));
104
+ return;
105
+ }
106
+ const files = await fs.promises.readdir(cachePath);
107
+ for (const file of files) {
108
+ await fs.promises.unlink(path.join(cachePath, file));
109
+ }
110
+ res.writeHead(200, { 'Content-Type': 'application/json' });
111
+ res.end(JSON.stringify({
112
+ message: 'Cache cleared',
113
+ filesDeleted: files.length,
114
+ }));
115
+ }
116
+ catch (error) {
117
+ res.writeHead(500, { 'Content-Type': 'application/json' });
118
+ res.end(JSON.stringify({
119
+ error: error instanceof Error ? error.message : 'Unknown error',
120
+ }));
121
+ }
122
+ });
123
+ },
124
+ };
125
+ }
126
+ function getExtensionFromMimeType(mimeType) {
127
+ const extensions = {
128
+ // Audio
129
+ 'audio/mpeg': 'mp3',
130
+ 'audio/mp3': 'mp3',
131
+ 'audio/wav': 'wav',
132
+ 'audio/ogg': 'ogg',
133
+ 'audio/webm': 'webm',
134
+ // Video
135
+ 'video/mp4': 'mp4',
136
+ 'video/webm': 'webm',
137
+ 'video/ogg': 'ogv',
138
+ // Images
139
+ 'image/png': 'png',
140
+ 'image/jpeg': 'jpg',
141
+ 'image/gif': 'gif',
142
+ 'image/svg+xml': 'svg',
143
+ 'image/webp': 'webp',
144
+ // Documents
145
+ 'application/pdf': 'pdf',
146
+ 'application/json': 'json',
147
+ 'text/plain': 'txt',
148
+ 'text/html': 'html',
149
+ 'text/css': 'css',
150
+ 'application/javascript': 'js',
151
+ };
152
+ return extensions[mimeType] || 'bin';
153
+ }
154
+ function writeFile(filePath, buffer) {
155
+ return new Promise((resolve, reject) => {
156
+ fs.createWriteStream(filePath)
157
+ .on('finish', resolve)
158
+ .on('error', reject)
159
+ .end(buffer);
160
+ });
161
+ }
162
+
163
+ export { motionCanvasCachePlugin };
164
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sources":["../src/vite-plugin/plugin.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "motion-canvas-cache",
3
+ "version": "0.1.0",
4
+ "description": "A generic file caching library for Motion Canvas projects with in-memory and server-side caching via Vite HMR",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./vite-plugin": "./dist/vite-plugin.js"
10
+ },
11
+ "scripts": {
12
+ "clean": "rm -rf dist",
13
+ "dev": "tsc --watch",
14
+ "build": "tsc",
15
+ "bundle": "rollup -c rollup.config.mjs",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "test:ui": "vitest --ui",
19
+ "prettier:fix": "prettier --write \"src/**/*.ts\"",
20
+ "lint": "eslint src/**/*.ts",
21
+ "eslint:fix": "eslint src/**/*.ts --fix",
22
+ "prepublishOnly": "npm run clean && npm run bundle"
23
+ },
24
+ "keywords": [
25
+ "motion-canvas",
26
+ "cache",
27
+ "caching",
28
+ "vite",
29
+ "hmr",
30
+ "file-cache"
31
+ ],
32
+ "author": "Patrick Rathje",
33
+ "license": "MIT",
34
+ "peerDependencies": {
35
+ "vite": "^5.0.0"
36
+ },
37
+ "files": [
38
+ "dist/**/*"
39
+ ],
40
+ "dependencies": {
41
+ "path-browserify": "^1.0.1"
42
+ },
43
+ "devDependencies": {
44
+ "@rollup/plugin-commonjs": "^28.0.6",
45
+ "@rollup/plugin-json": "^6.1.0",
46
+ "@rollup/plugin-node-resolve": "^16.0.1",
47
+ "@rollup/plugin-terser": "^0.4.4",
48
+ "@rollup/plugin-typescript": "^12.1.4",
49
+ "@types/node": "^24.1.0",
50
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
51
+ "@typescript-eslint/parser": "^6.0.0",
52
+ "@vitest/ui": "^4.0.16",
53
+ "eslint": "^8.0.0",
54
+ "eslint-plugin-tsdoc": "^0.4.0",
55
+ "happy-dom": "^20.1.0",
56
+ "prettier": "^2.8.4",
57
+ "prettier-plugin-organize-imports": "^4.2.0",
58
+ "rollup": "^4.50.0",
59
+ "rollup-plugin-dts": "^6.2.3",
60
+ "tsc-alias": "^1.8.16",
61
+ "tslib": "^2.8.1",
62
+ "typescript": "^5.0.0",
63
+ "vite": "^5.0.0",
64
+ "vitest": "^4.0.16"
65
+ }
66
+ }