@maas/payload-plugin-media-cloud 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/dist/adapter/{handleDelete.d.ts → handleDelete.d.mts} +2 -2
  2. package/dist/adapter/{handleDelete.js → handleDelete.mjs} +3 -3
  3. package/dist/adapter/handleDelete.mjs.map +1 -0
  4. package/dist/adapter/{handleUpload.d.ts → handleUpload.d.mts} +1 -1
  5. package/dist/adapter/{handleUpload.js → handleUpload.mjs} +1 -1
  6. package/dist/adapter/handleUpload.mjs.map +1 -0
  7. package/dist/adapter/{staticHandler.d.ts → staticHandler.d.mts} +2 -2
  8. package/dist/adapter/{staticHandler.js → staticHandler.mjs} +1 -1
  9. package/dist/adapter/staticHandler.mjs.map +1 -0
  10. package/dist/adapter/{storageAdapter.d.ts → storageAdapter.d.mts} +3 -3
  11. package/dist/adapter/{storageAdapter.js → storageAdapter.mjs} +4 -4
  12. package/dist/adapter/storageAdapter.mjs.map +1 -0
  13. package/dist/collections/{mediaCollection.d.ts → mediaCollection.d.mts} +2 -2
  14. package/dist/collections/{mediaCollection.js → mediaCollection.mjs} +24 -5
  15. package/dist/collections/mediaCollection.mjs.map +1 -0
  16. package/dist/components/index.d.mts +7 -0
  17. package/dist/components/index.mjs +5 -0
  18. package/dist/components/mux-preview/index.d.mts +2 -0
  19. package/dist/components/mux-preview/index.mjs +3 -0
  20. package/dist/components/mux-preview/{mux-preview.d.ts → mux-preview.d.mts} +1 -1
  21. package/dist/components/mux-preview/{mux-preview.js → mux-preview.mjs} +2 -11
  22. package/dist/components/mux-preview/mux-preview.mjs.map +1 -0
  23. package/dist/components/upload-handler/index.d.mts +2 -0
  24. package/dist/components/upload-handler/index.mjs +3 -0
  25. package/dist/components/upload-handler/{upload-handler.d.ts → upload-handler.d.mts} +1 -1
  26. package/dist/components/upload-handler/{upload-handler.js → upload-handler.mjs} +17 -19
  27. package/dist/components/upload-handler/upload-handler.mjs.map +1 -0
  28. package/dist/components/upload-manager/index.d.mts +2 -0
  29. package/dist/components/upload-manager/index.mjs +3 -0
  30. package/dist/components/upload-manager/upload-manager.css +0 -1
  31. package/dist/components/upload-manager/{upload-manager.d.ts → upload-manager.d.mts} +1 -1
  32. package/dist/components/upload-manager/upload-manager.mjs +274 -0
  33. package/dist/components/upload-manager/upload-manager.mjs.map +1 -0
  34. package/dist/endpoints/{muxAssetHandler.d.ts → muxAssetHandler.d.mts} +1 -1
  35. package/dist/endpoints/{muxAssetHandler.js → muxAssetHandler.mjs} +3 -4
  36. package/dist/endpoints/muxAssetHandler.mjs.map +1 -0
  37. package/dist/endpoints/{muxCreateUploadHandler.d.ts → muxCreateUploadHandler.d.mts} +2 -2
  38. package/dist/endpoints/{muxCreateUploadHandler.js → muxCreateUploadHandler.mjs} +4 -5
  39. package/dist/endpoints/muxCreateUploadHandler.mjs.map +1 -0
  40. package/dist/endpoints/{muxWebhookHandler.d.ts → muxWebhookHandler.d.mts} +1 -1
  41. package/dist/endpoints/{muxWebhookHandler.js → muxWebhookHandler.mjs} +1 -1
  42. package/dist/endpoints/muxWebhookHandler.mjs.map +1 -0
  43. package/dist/endpoints/tusPostProcessorHandler.d.mts +11 -0
  44. package/dist/endpoints/tusPostProcessorHandler.mjs +48 -0
  45. package/dist/endpoints/tusPostProcessorHandler.mjs.map +1 -0
  46. package/dist/error-handler/dist/{index.js → index.mjs} +4 -8
  47. package/dist/error-handler/dist/index.mjs.map +1 -0
  48. package/dist/hooks/{useEmitter.d.ts → useEmitter.d.mts} +1 -1
  49. package/dist/hooks/{useEmitter.js → useEmitter.mjs} +1 -1
  50. package/dist/hooks/useEmitter.mjs.map +1 -0
  51. package/dist/hooks/useErrorHandler.d.mts +177 -0
  52. package/dist/hooks/{useErrorHandler.js → useErrorHandler.mjs} +3 -3
  53. package/dist/hooks/useErrorHandler.mjs.map +1 -0
  54. package/dist/index.d.mts +3 -0
  55. package/dist/index.mjs +3 -0
  56. package/dist/{plugin.d.ts → plugin.d.mts} +2 -2
  57. package/dist/{plugin.js → plugin.mjs} +23 -14
  58. package/dist/plugin.mjs.map +1 -0
  59. package/dist/tus/stores/s3/{expiration-manager.d.ts → expiration-manager.d.mts} +1 -1
  60. package/dist/tus/stores/s3/{expiration-manager.js → expiration-manager.mjs} +1 -1
  61. package/dist/tus/stores/s3/expiration-manager.mjs.map +1 -0
  62. package/dist/tus/stores/s3/{file-operations.d.ts → file-operations.d.mts} +1 -1
  63. package/dist/tus/stores/s3/{file-operations.js → file-operations.mjs} +4 -5
  64. package/dist/tus/stores/s3/file-operations.mjs.map +1 -0
  65. package/dist/tus/stores/s3/{metadata-manager.d.ts → metadata-manager.d.mts} +2 -2
  66. package/dist/tus/stores/s3/{metadata-manager.js → metadata-manager.mjs} +3 -3
  67. package/dist/tus/stores/s3/metadata-manager.mjs.map +1 -0
  68. package/dist/tus/stores/s3/{parts-manager.d.ts → parts-manager.d.mts} +5 -5
  69. package/dist/tus/stores/s3/{parts-manager.js → parts-manager.mjs} +11 -15
  70. package/dist/tus/stores/s3/parts-manager.mjs.map +1 -0
  71. package/dist/tus/stores/s3/{s3-store.d.ts → s3-store.d.mts} +7 -7
  72. package/dist/tus/stores/s3/{s3-store.js → s3-store.mjs} +18 -29
  73. package/dist/tus/stores/s3/s3-store.mjs.map +1 -0
  74. package/dist/tus/stores/s3/{semaphore.d.ts → semaphore.d.mts} +1 -1
  75. package/dist/tus/stores/s3/{semaphore.js → semaphore.mjs} +2 -3
  76. package/dist/tus/stores/s3/semaphore.mjs.map +1 -0
  77. package/dist/types/errors.d.mts +142 -0
  78. package/dist/types/{errors.js → errors.mjs} +13 -1
  79. package/dist/types/errors.mjs.map +1 -0
  80. package/dist/types/{index.d.ts → index.d.mts} +1 -1
  81. package/dist/types/index.mjs +1 -0
  82. package/dist/utils/{file.d.ts → file.d.mts} +1 -1
  83. package/dist/utils/{file.js → file.mjs} +7 -11
  84. package/dist/utils/file.mjs.map +1 -0
  85. package/package.json +20 -16
  86. package/dist/adapter/handleDelete.js.map +0 -1
  87. package/dist/adapter/handleUpload.js.map +0 -1
  88. package/dist/adapter/staticHandler.js.map +0 -1
  89. package/dist/adapter/storageAdapter.js.map +0 -1
  90. package/dist/collections/mediaCollection.js.map +0 -1
  91. package/dist/components/index.d.ts +0 -4
  92. package/dist/components/index.js +0 -5
  93. package/dist/components/mux-preview/index.d.ts +0 -2
  94. package/dist/components/mux-preview/index.js +0 -3
  95. package/dist/components/mux-preview/mux-preview.js.map +0 -1
  96. package/dist/components/upload-handler/index.d.ts +0 -2
  97. package/dist/components/upload-handler/index.js +0 -3
  98. package/dist/components/upload-handler/upload-handler.js.map +0 -1
  99. package/dist/components/upload-manager/index.d.ts +0 -2
  100. package/dist/components/upload-manager/index.js +0 -3
  101. package/dist/components/upload-manager/upload-manager.js +0 -315
  102. package/dist/components/upload-manager/upload-manager.js.map +0 -1
  103. package/dist/endpoints/muxAssetHandler.js.map +0 -1
  104. package/dist/endpoints/muxCreateUploadHandler.js.map +0 -1
  105. package/dist/endpoints/muxWebhookHandler.js.map +0 -1
  106. package/dist/error-handler/dist/index.js.map +0 -1
  107. package/dist/hooks/useEmitter.js.map +0 -1
  108. package/dist/hooks/useErrorHandler.d.ts +0 -12
  109. package/dist/hooks/useErrorHandler.js.map +0 -1
  110. package/dist/index.d.ts +0 -3
  111. package/dist/index.js +0 -3
  112. package/dist/plugin.js.map +0 -1
  113. package/dist/tus/stores/s3/expiration-manager.js.map +0 -1
  114. package/dist/tus/stores/s3/file-operations.js.map +0 -1
  115. package/dist/tus/stores/s3/metadata-manager.js.map +0 -1
  116. package/dist/tus/stores/s3/parts-manager.js.map +0 -1
  117. package/dist/tus/stores/s3/s3-store.js.map +0 -1
  118. package/dist/tus/stores/s3/semaphore.js.map +0 -1
  119. package/dist/types/errors.d.ts +0 -8
  120. package/dist/types/errors.js.map +0 -1
  121. package/dist/types/index.js +0 -0
  122. package/dist/utils/file.js.map +0 -1
@@ -0,0 +1,274 @@
1
+ 'use client';
2
+
3
+ import { MediaCloudErrors } from "../../types/errors.mjs";
4
+ import { useErrorHandler } from "../../hooks/useErrorHandler.mjs";
5
+ import { useEmitter } from "../../hooks/useEmitter.mjs";
6
+ import { createContext, use, useCallback, useEffect, useRef, useState } from "react";
7
+ import { Button } from "@payloadcms/ui";
8
+ import "./upload-manager.css";
9
+
10
+ //#region src/components/upload-manager/upload-manager.tsx
11
+ const UploadManagerContext = createContext({
12
+ showUploadManager: false,
13
+ activeUploads: [],
14
+ addUpload: () => {},
15
+ updateUpload: () => {}
16
+ });
17
+ /**
18
+ * Provider component for upload management context
19
+ * @param args - Arguments including children to wrap
20
+ * @returns JSX element providing upload management context
21
+ */
22
+ function UploadManagerProvider(args) {
23
+ const { children } = args;
24
+ const [showUploadManager, setShowUploadManager] = useState(false);
25
+ const [activeUploads, setActiveUploads] = useState([]);
26
+ const [activeTab, setActiveTab] = useState("uploading");
27
+ const activeTabRef = useRef(activeTab);
28
+ const activeUploadsRef = useRef(activeUploads);
29
+ const { logError } = useErrorHandler();
30
+ useEffect(() => {
31
+ activeTabRef.current = activeTab;
32
+ }, [activeTab]);
33
+ useEffect(() => {
34
+ activeUploadsRef.current = activeUploads;
35
+ }, [activeUploads]);
36
+ const emitter = useEmitter();
37
+ const checkAutoSwitchToCompleted = useCallback((uploads) => {
38
+ const hasActiveUploads = uploads.some((upload) => upload.status === "uploading");
39
+ const hasProcessingUploads = uploads.some((upload) => upload.status === "processing");
40
+ const hasCompletedUploads = uploads.some((upload) => upload.status === "completed");
41
+ if (!hasActiveUploads && !hasProcessingUploads && hasCompletedUploads && activeTabRef.current !== "completed") setActiveTab("completed");
42
+ }, []);
43
+ useEffect(() => {
44
+ const pollingUploads = activeUploads.filter((upload) => upload.polling && upload.pollingUrl);
45
+ if (pollingUploads.length === 0) return;
46
+ const pollAssets = async () => {
47
+ for (const pollingUpload of pollingUploads) try {
48
+ const response = await fetch(`${pollingUpload.pollingUrl}?upload_id=${pollingUpload.id}`, {
49
+ method: "GET",
50
+ credentials: "include"
51
+ });
52
+ if (response.ok) {
53
+ if ((await response.json()).ready) setActiveUploads((prev) => {
54
+ const updatedUploads = prev.map((upload) => upload.id === pollingUpload.id ? {
55
+ ...upload,
56
+ polling: false,
57
+ progress: 100,
58
+ status: "completed"
59
+ } : upload);
60
+ setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0);
61
+ return updatedUploads;
62
+ });
63
+ }
64
+ } catch (_error) {
65
+ logError(MediaCloudErrors.UPLOAD_POLLING_ERROR);
66
+ }
67
+ };
68
+ const intervalId = setInterval(pollAssets, 2e3);
69
+ return () => clearInterval(intervalId);
70
+ }, [
71
+ activeUploads,
72
+ checkAutoSwitchToCompleted,
73
+ logError
74
+ ]);
75
+ /**
76
+ * Handles the 'upload-errored' event
77
+ * @param event - The upload error event
78
+ */
79
+ const onUploadError = useCallback((event) => {
80
+ const { id, error } = event;
81
+ logError(MediaCloudErrors.TUS_UPLOAD_ERROR);
82
+ setActiveUploads((prev) => prev.map((upload) => upload.id === id ? {
83
+ ...upload,
84
+ error,
85
+ status: "completed"
86
+ } : upload));
87
+ }, [logError]);
88
+ /**
89
+ * Handles the 'add-upload' event
90
+ * @param event - The add upload event
91
+ */
92
+ const onAddUpload = useCallback((event) => {
93
+ const upload = {
94
+ id: event.id,
95
+ filename: event.filename,
96
+ progress: 0,
97
+ polling: event.polling,
98
+ pollingUrl: event.pollingUrl,
99
+ status: "uploading"
100
+ };
101
+ setActiveUploads((prev) => [...prev, upload]);
102
+ setShowUploadManager(true);
103
+ if (activeTabRef.current !== "uploading") setActiveTab("uploading");
104
+ }, []);
105
+ /**
106
+ * Handles the 'update-upload' event
107
+ * @param event - The update upload event
108
+ */
109
+ const onUpdateUpload = useCallback((event) => {
110
+ const { id, progress, polling } = event;
111
+ setActiveUploads((prev) => prev.map((upload) => upload.id === id ? {
112
+ ...upload,
113
+ progress,
114
+ ...polling !== void 0 && { polling },
115
+ status: polling ? "processing" : progress >= 100 ? "completed" : "uploading"
116
+ } : upload));
117
+ }, []);
118
+ /**
119
+ * Handles the 'remove-upload' event
120
+ * @param event - The remove upload event
121
+ */
122
+ const onRemoveUpload = useCallback((event) => {
123
+ setActiveUploads((prev) => prev.filter((upload) => upload.id !== event.id));
124
+ }, []);
125
+ /**
126
+ * Handles the 'upload-completed' event
127
+ * @param event - The upload completed event
128
+ */
129
+ const onUploadCompleted = useCallback((event) => {
130
+ if (activeUploadsRef.current.find((upload) => upload.id === event.id)?.pollingUrl) setActiveUploads((prev) => prev.map((upload) => upload.id === event.id ? {
131
+ ...upload,
132
+ polling: true,
133
+ progress: 100,
134
+ status: "processing"
135
+ } : upload));
136
+ else setActiveUploads((prev) => {
137
+ const updatedUploads = prev.map((upload) => upload.id === event.id ? {
138
+ ...upload,
139
+ progress: 100,
140
+ status: "completed"
141
+ } : upload);
142
+ setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0);
143
+ return updatedUploads;
144
+ });
145
+ }, [checkAutoSwitchToCompleted]);
146
+ useEffect(() => {
147
+ emitter.on("add-upload", onAddUpload);
148
+ emitter.on("update-upload", onUpdateUpload);
149
+ emitter.on("remove-upload", onRemoveUpload);
150
+ emitter.on("upload-errored", onUploadError);
151
+ emitter.on("upload-completed", onUploadCompleted);
152
+ return () => {
153
+ emitter.off("add-upload", onAddUpload);
154
+ emitter.off("update-upload", onUpdateUpload);
155
+ emitter.off("remove-upload", onRemoveUpload);
156
+ emitter.off("upload-errored", onUploadError);
157
+ emitter.off("upload-completed", onUploadCompleted);
158
+ };
159
+ }, [
160
+ emitter,
161
+ onAddUpload,
162
+ onUpdateUpload,
163
+ onRemoveUpload,
164
+ onUploadError,
165
+ onUploadCompleted
166
+ ]);
167
+ /**
168
+ * Adds a new upload to the manager
169
+ * @param args - The upload arguments
170
+ */
171
+ const addUpload = useCallback((args$1) => {
172
+ const { id, filename, polling = false, pollingUrl } = args$1;
173
+ const upload = {
174
+ id,
175
+ filename,
176
+ progress: 0,
177
+ polling,
178
+ pollingUrl,
179
+ status: "uploading"
180
+ };
181
+ setActiveUploads((prev) => [...prev, upload]);
182
+ }, []);
183
+ /**
184
+ * Updates an existing upload in the manager
185
+ * @param args - The update arguments
186
+ */
187
+ const updateUpload = useCallback((args$1) => {
188
+ const { id, progress, polling } = args$1;
189
+ setActiveUploads((prev) => prev.map((upload) => upload.id === id ? {
190
+ ...upload,
191
+ progress,
192
+ ...polling !== void 0 && { polling },
193
+ status: polling ? "processing" : progress >= 100 ? "completed" : "uploading"
194
+ } : upload));
195
+ }, []);
196
+ const uploadingFiles = activeUploads.filter((upload) => upload.status === "uploading");
197
+ const processingFiles = activeUploads.filter((upload) => upload.status === "processing");
198
+ const completedFiles = activeUploads.filter((upload) => upload.status === "completed");
199
+ /**
200
+ * Renders the upload list
201
+ * @param args - The render arguments
202
+ * @returns JSX element representing the upload list
203
+ */
204
+ function renderUploadList(args$1) {
205
+ const { uploads } = args$1;
206
+ return <ul>
207
+ {uploads.map((upload) => <li key={upload.id} data-status={upload.status}>
208
+ <div className="upload-info">
209
+ <span className="upload-filename">{upload.filename}</span>
210
+ <span className="upload-meta">
211
+ {upload.status === "processing" ? "Processing..." : upload.progress < 100 ? `${Math.ceil(upload.progress)}%` : "Completed"}
212
+ </span>
213
+ </div>
214
+ <div className="upload-progress-bar" style={{ ["--progress"]: upload.status === "processing" ? "1" : `${upload.progress / 100}` }}>
215
+ <div data-active={upload.status === "processing"} className="upload-progress" />
216
+ </div>
217
+ </li>)}
218
+ </ul>;
219
+ }
220
+ /**
221
+ * Closes the upload manager
222
+ */
223
+ function closeUploadManager() {
224
+ if (!activeUploads.some((upload) => upload.polling)) {
225
+ setActiveUploads([]);
226
+ setShowUploadManager(false);
227
+ }
228
+ }
229
+ const value = {
230
+ activeUploads,
231
+ addUpload,
232
+ updateUpload
233
+ };
234
+ return <UploadManagerContext.Provider value={value}>
235
+ {showUploadManager && <div className="upload-manager">
236
+ <div className="upload-manager__header">
237
+ <h4>Uploads</h4>
238
+ <Button buttonStyle="icon-label" icon="x" margin={false} onClick={closeUploadManager} />
239
+ </div>
240
+
241
+ <div className="upload-manager__tabs">
242
+ <button data-active={activeTab === "uploading"} className="upload-tab" onClick={() => setActiveTab("uploading")}>
243
+ Uploading ({uploadingFiles.length})
244
+ </button>
245
+ <button data-active={activeTab === "processing"} className="upload-tab" onClick={() => setActiveTab("processing")}>
246
+ Processing ({processingFiles.length})
247
+ </button>
248
+ <button data-active={activeTab === "completed"} className="upload-tab" onClick={() => setActiveTab("completed")}>
249
+ Completed ({completedFiles.length})
250
+ </button>
251
+ </div>
252
+
253
+ <div className="upload-manager__content">
254
+ {activeTab === "uploading" && uploadingFiles.length > 0 && <div>{renderUploadList({ uploads: uploadingFiles })}</div>}
255
+ {activeTab === "processing" && processingFiles.length > 0 && <div>{renderUploadList({ uploads: processingFiles })}</div>}
256
+ {activeTab === "completed" && completedFiles.length > 0 && <div>
257
+ {renderUploadList({ uploads: completedFiles })}
258
+ <div className="upload-manager__footer">
259
+ <Button buttonStyle="subtle" size="small" margin={false} onClick={() => window?.location?.reload()}>
260
+ Refresh
261
+ </Button>
262
+ </div>
263
+ </div>}
264
+ {(activeTab === "uploading" && uploadingFiles.length === 0 || activeTab === "processing" && processingFiles.length === 0 || activeTab === "completed" && completedFiles.length === 0) && <p className="upload-empty-state">No {activeTab} files</p>}
265
+ </div>
266
+ </div>}
267
+ {children}
268
+ </UploadManagerContext.Provider>;
269
+ }
270
+ const useUploadManagerContext = () => use(UploadManagerContext);
271
+
272
+ //#endregion
273
+ export { UploadManagerProvider, useUploadManagerContext };
274
+ //# sourceMappingURL=upload-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-manager.mjs","names":["upload: Upload","args","value: UploadManagerContextType"],"sources":["../../../src/components/upload-manager/upload-manager.tsx"],"sourcesContent":["'use client'\n\nimport {\n createContext,\n use,\n useState,\n useCallback,\n useEffect,\n useRef,\n} from 'react'\nimport { Button } from '@payloadcms/ui'\n\nimport { useEmitter } from '../../hooks/useEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../../types/errors'\n\nimport type React from 'react'\n\nimport './upload-manager.css'\n\ninterface Upload {\n id: string\n filename: string\n progress: number\n error?: string\n polling?: boolean\n pollingUrl?: string\n status?: 'uploading' | 'processing' | 'completed'\n}\n\ninterface UploadManagerContextType {\n showUploadManager?: boolean\n activeUploads: Upload[]\n addUpload: (args: AddUploadArgs) => void\n updateUpload: (args: UpdateUploadArgs) => void\n}\n\ninterface UploadManagerProviderArgs {\n children: React.ReactNode\n}\n\ninterface OnAddUploadEvent {\n id: string\n filename: string\n polling?: boolean\n pollingUrl?: string\n}\n\ninterface OnUpdateUploadEvent {\n id: string\n progress: number\n polling?: boolean\n}\n\ninterface AddUploadArgs {\n id: string\n filename: string\n polling?: boolean\n pollingUrl?: string\n}\n\ninterface UpdateUploadArgs {\n id: string\n progress: number\n polling?: boolean\n}\n\ninterface RenderUploadListArgs {\n uploads: Upload[]\n}\n\nconst UploadManagerContext = createContext<UploadManagerContextType>({\n showUploadManager: false,\n activeUploads: [],\n addUpload: () => {},\n updateUpload: () => {},\n})\n\n/**\n * Provider component for upload management context\n * @param args - Arguments including children to wrap\n * @returns JSX element providing upload management context\n */\nexport function UploadManagerProvider(args: UploadManagerProviderArgs) {\n const { children } = args\n const [showUploadManager, setShowUploadManager] = useState(false)\n const [activeUploads, setActiveUploads] = useState<Upload[]>([])\n const [activeTab, setActiveTab] = useState<\n 'uploading' | 'processing' | 'completed'\n >('uploading')\n\n const activeTabRef = useRef(activeTab)\n const activeUploadsRef = useRef(activeUploads)\n\n const { logError } = useErrorHandler()\n\n // Keep refs in sync with state\n useEffect(() => {\n activeTabRef.current = activeTab\n }, [activeTab])\n\n useEffect(() => {\n activeUploadsRef.current = activeUploads\n }, [activeUploads])\n\n const emitter = useEmitter()\n\n // Helper function to check if we should auto-switch to completed tab\n const checkAutoSwitchToCompleted = useCallback((uploads: Upload[]) => {\n const hasActiveUploads = uploads.some(\n (upload) => upload.status === 'uploading'\n )\n const hasProcessingUploads = uploads.some(\n (upload) => upload.status === 'processing'\n )\n const hasCompletedUploads = uploads.some(\n (upload) => upload.status === 'completed'\n )\n\n // Auto-switch to completed tab if no uploading/processing uploads remain\n if (\n !hasActiveUploads &&\n !hasProcessingUploads &&\n hasCompletedUploads &&\n activeTabRef.current !== 'completed'\n ) {\n setActiveTab('completed')\n }\n }, [])\n\n // Polling logic\n useEffect(() => {\n const pollingUploads = activeUploads.filter(\n (upload) => upload.polling && upload.pollingUrl\n )\n\n if (pollingUploads.length === 0) {\n return\n }\n\n const pollAssets = async () => {\n for (const pollingUpload of pollingUploads) {\n try {\n const response = await fetch(\n `${pollingUpload.pollingUrl}?upload_id=${pollingUpload.id}`,\n {\n method: 'GET',\n credentials: 'include',\n }\n )\n\n if (response.ok) {\n const data = await response.json()\n\n if (data.ready) {\n // Asset is ready, stop polling for this upload\n setActiveUploads((prev) => {\n const updatedUploads = prev.map((upload) =>\n upload.id === pollingUpload.id\n ? {\n ...upload,\n polling: false,\n progress: 100,\n status: 'completed' as const,\n }\n : upload\n )\n\n // Check if we should auto-switch to completed tab\n setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0)\n\n return updatedUploads\n })\n }\n }\n } catch (_error) {\n logError(MediaCloudErrors.UPLOAD_POLLING_ERROR)\n }\n }\n }\n\n const intervalId = setInterval(pollAssets, 2000) // Poll every 2 seconds\n\n return () => clearInterval(intervalId)\n }, [activeUploads, checkAutoSwitchToCompleted, logError])\n\n /**\n * Handles the 'upload-errored' event\n * @param event - The upload error event\n */\n const onUploadError = useCallback(\n (event: { id: string; error: string }) => {\n const { id, error } = event\n\n logError(MediaCloudErrors.TUS_UPLOAD_ERROR)\n\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.id === id\n ? { ...upload, error: error, status: 'completed' }\n : upload\n )\n )\n },\n [logError]\n )\n\n /**\n * Handles the 'add-upload' event\n * @param event - The add upload event\n */\n const onAddUpload = useCallback((event: OnAddUploadEvent) => {\n const upload: Upload = {\n id: event.id,\n filename: event.filename,\n progress: 0,\n polling: event.polling,\n pollingUrl: event.pollingUrl,\n status: 'uploading',\n }\n\n setActiveUploads((prev) => [...prev, upload])\n\n // Show the upload manager when new upload starts\n setShowUploadManager(true)\n\n // Auto-switch to uploading tab when new upload starts\n if (activeTabRef.current !== 'uploading') {\n setActiveTab('uploading')\n }\n }, [])\n\n /**\n * Handles the 'update-upload' event\n * @param event - The update upload event\n */\n const onUpdateUpload = useCallback((event: OnUpdateUploadEvent) => {\n const { id, progress, polling } = event\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.id === id\n ? {\n ...upload,\n progress,\n ...(polling !== undefined && { polling }),\n status: polling\n ? 'processing'\n : progress >= 100\n ? 'completed'\n : 'uploading',\n }\n : upload\n )\n )\n }, [])\n\n /**\n * Handles the 'remove-upload' event\n * @param event - The remove upload event\n */\n const onRemoveUpload = useCallback((event: { id: string }) => {\n setActiveUploads((prev) => prev.filter((upload) => upload.id !== event.id))\n }, [])\n\n /**\n * Handles the 'upload-completed' event\n * @param event - The upload completed event\n */\n const onUploadCompleted = useCallback(\n (event: { id: string }) => {\n // Check if this upload has a polling URL (Mux upload)\n const upload = activeUploadsRef.current.find(\n (upload) => upload.id === event.id\n )\n if (upload?.pollingUrl) {\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.id === event.id\n ? {\n ...upload,\n polling: true,\n progress: 100,\n status: 'processing' as const,\n }\n : upload\n )\n )\n } else {\n // Regular upload completion\n setActiveUploads((prev) => {\n const updatedUploads = prev.map((upload) =>\n upload.id === event.id\n ? { ...upload, progress: 100, status: 'completed' as const }\n : upload\n )\n\n // Check if we should auto-switch to completed tab\n setTimeout(() => checkAutoSwitchToCompleted(updatedUploads), 0)\n\n return updatedUploads\n })\n }\n },\n [checkAutoSwitchToCompleted]\n )\n\n useEffect(() => {\n emitter.on('add-upload', onAddUpload)\n emitter.on('update-upload', onUpdateUpload)\n emitter.on('remove-upload', onRemoveUpload)\n emitter.on('upload-errored', onUploadError)\n emitter.on('upload-completed', onUploadCompleted)\n\n return () => {\n emitter.off('add-upload', onAddUpload)\n emitter.off('update-upload', onUpdateUpload)\n emitter.off('remove-upload', onRemoveUpload)\n emitter.off('upload-errored', onUploadError)\n emitter.off('upload-completed', onUploadCompleted)\n }\n }, [\n emitter,\n onAddUpload,\n onUpdateUpload,\n onRemoveUpload,\n onUploadError,\n onUploadCompleted,\n ])\n\n /**\n * Adds a new upload to the manager\n * @param args - The upload arguments\n */\n const addUpload = useCallback((args: AddUploadArgs) => {\n const { id, filename, polling = false, pollingUrl } = args\n const upload: Upload = {\n id,\n filename,\n progress: 0,\n polling,\n pollingUrl,\n status: 'uploading',\n }\n\n setActiveUploads((prev) => [...prev, upload])\n }, [])\n\n /**\n * Updates an existing upload in the manager\n * @param args - The update arguments\n */\n const updateUpload = useCallback((args: UpdateUploadArgs) => {\n const { id, progress, polling } = args\n setActiveUploads((prev) =>\n prev.map((upload) =>\n upload.id === id\n ? {\n ...upload,\n progress,\n ...(polling !== undefined && { polling }),\n status: polling\n ? 'processing'\n : progress >= 100\n ? 'completed'\n : 'uploading',\n }\n : upload\n )\n )\n }, [])\n\n // Filter uploads by status\n const uploadingFiles = activeUploads.filter(\n (upload) => upload.status === 'uploading'\n )\n const processingFiles = activeUploads.filter(\n (upload) => upload.status === 'processing'\n )\n const completedFiles = activeUploads.filter(\n (upload) => upload.status === 'completed'\n )\n\n /**\n * Renders the upload list\n * @param args - The render arguments\n * @returns JSX element representing the upload list\n */\n function renderUploadList(args: RenderUploadListArgs) {\n const { uploads } = args\n return (\n <ul>\n {uploads.map((upload) => (\n <li key={upload.id} data-status={upload.status}>\n <div className=\"upload-info\">\n <span className=\"upload-filename\">{upload.filename}</span>\n <span className=\"upload-meta\">\n {upload.status === 'processing'\n ? 'Processing...'\n : upload.progress < 100\n ? `${Math.ceil(upload.progress)}%`\n : 'Completed'}\n </span>\n </div>\n <div\n className=\"upload-progress-bar\"\n style={\n {\n ['--progress']:\n upload.status === 'processing'\n ? '1'\n : `${upload.progress / 100}`,\n } as React.CSSProperties\n }\n >\n <div\n data-active={upload.status === 'processing'}\n className=\"upload-progress\"\n />\n </div>\n </li>\n ))}\n </ul>\n )\n }\n\n /**\n * Closes the upload manager\n */\n function closeUploadManager() {\n // Only allow closing if no uploads are actively polling\n const hasPollingUploads = activeUploads.some((upload) => upload.polling)\n if (!hasPollingUploads) {\n setActiveUploads([])\n setShowUploadManager(false)\n }\n }\n\n const value: UploadManagerContextType = {\n activeUploads,\n addUpload,\n updateUpload,\n }\n\n return (\n <UploadManagerContext.Provider value={value}>\n {showUploadManager && (\n <div className=\"upload-manager\">\n <div className=\"upload-manager__header\">\n <h4>Uploads</h4>\n <Button\n buttonStyle=\"icon-label\"\n icon=\"x\"\n margin={false}\n onClick={closeUploadManager}\n />\n </div>\n\n <div className=\"upload-manager__tabs\">\n <button\n data-active={activeTab === 'uploading'}\n className=\"upload-tab\"\n onClick={() => setActiveTab('uploading')}\n >\n Uploading ({uploadingFiles.length})\n </button>\n <button\n data-active={activeTab === 'processing'}\n className=\"upload-tab\"\n onClick={() => setActiveTab('processing')}\n >\n Processing ({processingFiles.length})\n </button>\n <button\n data-active={activeTab === 'completed'}\n className=\"upload-tab\"\n onClick={() => setActiveTab('completed')}\n >\n Completed ({completedFiles.length})\n </button>\n </div>\n\n <div className=\"upload-manager__content\">\n {activeTab === 'uploading' && uploadingFiles.length > 0 && (\n <div>{renderUploadList({ uploads: uploadingFiles })}</div>\n )}\n {activeTab === 'processing' && processingFiles.length > 0 && (\n <div>{renderUploadList({ uploads: processingFiles })}</div>\n )}\n {activeTab === 'completed' && completedFiles.length > 0 && (\n <div>\n {renderUploadList({ uploads: completedFiles })}\n <div className=\"upload-manager__footer\">\n <Button\n buttonStyle=\"subtle\"\n size=\"small\"\n margin={false}\n onClick={() => window?.location?.reload()}\n >\n Refresh\n </Button>\n </div>\n </div>\n )}\n {((activeTab === 'uploading' && uploadingFiles.length === 0) ||\n (activeTab === 'processing' && processingFiles.length === 0) ||\n (activeTab === 'completed' && completedFiles.length === 0)) && (\n <p className=\"upload-empty-state\">No {activeTab} files</p>\n )}\n </div>\n </div>\n )}\n {children}\n </UploadManagerContext.Provider>\n )\n}\n\nexport const useUploadManagerContext = () => use(UploadManagerContext)\n"],"mappings":"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"}
@@ -8,4 +8,4 @@ interface GetMuxAssetHandlerArgs {
8
8
  declare function getMuxAssetHandler(args: GetMuxAssetHandlerArgs): PayloadHandler;
9
9
  //#endregion
10
10
  export { getMuxAssetHandler };
11
- //# sourceMappingURL=muxAssetHandler.d.ts.map
11
+ //# sourceMappingURL=muxAssetHandler.d.mts.map
@@ -7,11 +7,10 @@ function getMuxAssetHandler(args) {
7
7
  const { query } = req;
8
8
  const uploadId = query.upload_id;
9
9
  if (!uploadId) return Response.json({ message: "Upload ID is required" }, { status: 400 });
10
- const assets = await mux.video.assets.list({
10
+ const asset = (await mux.video.assets.list({
11
11
  limit: 1,
12
12
  upload_id: uploadId
13
- });
14
- const asset = assets?.data[0];
13
+ }))?.data[0];
15
14
  if (!asset) return Response.json({ message: "No asset found for the given upload ID" }, { status: 404 });
16
15
  if (asset.status === "ready") {
17
16
  const { payload } = req;
@@ -57,4 +56,4 @@ function getMuxAssetHandler(args) {
57
56
 
58
57
  //#endregion
59
58
  export { getMuxAssetHandler };
60
- //# sourceMappingURL=muxAssetHandler.js.map
59
+ //# sourceMappingURL=muxAssetHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muxAssetHandler.mjs","names":[],"sources":["../../src/endpoints/muxAssetHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\nimport type { PayloadHandler } from 'payload'\nimport type { StaticRenditions } from '../types'\n\ninterface GetMuxAssetHandlerArgs {\n getMuxClient: () => Mux\n}\n\nexport function getMuxAssetHandler(\n args: GetMuxAssetHandlerArgs\n): PayloadHandler {\n const { getMuxClient } = args\n\n return async (req) => {\n try {\n const mux = getMuxClient()\n const { query } = req\n\n const uploadId = query.upload_id as string\n\n if (!uploadId) {\n return Response.json(\n { message: 'Upload ID is required' },\n { status: 400 }\n )\n }\n\n const assets = await mux.video.assets.list({\n limit: 1,\n upload_id: uploadId,\n })\n\n const asset = assets?.data[0]\n\n if (!asset) {\n return Response.json(\n { message: 'No asset found for the given upload ID' },\n { status: 404 }\n )\n }\n\n if (asset.status === 'ready') {\n const { payload } = req\n\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n 'mux.uploadId': {\n equals: uploadId,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n if (docs.length > 0) {\n if (asset?.status === 'ready') {\n const { id } = docs[0]\n await payload.update({\n collection: 'media',\n id,\n data: {\n mux: {\n status: asset.status,\n assetId: asset.id,\n playbackId: asset.playback_ids?.[0]?.id,\n aspectRatio: asset.aspect_ratio,\n duration: asset.duration,\n tracks: asset.tracks,\n maxResolutionTier: asset.max_resolution_tier,\n videoQuality: asset.video_quality,\n staticRenditions: asset.static_renditions as StaticRenditions,\n },\n },\n })\n }\n }\n\n return Response.json(\n {\n ready: asset.status === 'ready',\n asset,\n },\n { status: 200 }\n )\n } else {\n return Response.json(\n {\n ready: false,\n asset,\n },\n { status: 200 }\n )\n }\n } catch (_error) {\n return Response.json(\n { message: 'Failed to fetch Mux asset' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";AAQA,SAAgB,mBACd,MACgB;CAChB,MAAM,EAAE,iBAAiB;AAEzB,QAAO,OAAO,QAAQ;AACpB,MAAI;GACF,MAAM,MAAM,cAAc;GAC1B,MAAM,EAAE,UAAU;GAElB,MAAM,WAAW,MAAM;AAEvB,OAAI,CAAC,SACH,QAAO,SAAS,KACd,EAAE,SAAS,yBAAyB,EACpC,EAAE,QAAQ,KAAK,CAChB;GAQH,MAAM,SALS,MAAM,IAAI,MAAM,OAAO,KAAK;IACzC,OAAO;IACP,WAAW;IACZ,CAAC,GAEoB,KAAK;AAE3B,OAAI,CAAC,MACH,QAAO,SAAS,KACd,EAAE,SAAS,0CAA0C,EACrD,EAAE,QAAQ,KAAK,CAChB;AAGH,OAAI,MAAM,WAAW,SAAS;IAC5B,MAAM,EAAE,YAAY;IAEpB,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;KAClC,YAAY;KACZ,OAAO,EACL,gBAAgB,EACd,QAAQ,UACT,EACF;KACD,OAAO;KACP,YAAY;KACb,CAAC;AAEF,QAAI,KAAK,SAAS,GAChB;SAAI,OAAO,WAAW,SAAS;MAC7B,MAAM,EAAE,OAAO,KAAK;AACpB,YAAM,QAAQ,OAAO;OACnB,YAAY;OACZ;OACA,MAAM,EACJ,KAAK;QACH,QAAQ,MAAM;QACd,SAAS,MAAM;QACf,YAAY,MAAM,eAAe,IAAI;QACrC,aAAa,MAAM;QACnB,UAAU,MAAM;QAChB,QAAQ,MAAM;QACd,mBAAmB,MAAM;QACzB,cAAc,MAAM;QACpB,kBAAkB,MAAM;QACzB,EACF;OACF,CAAC;;;AAIN,WAAO,SAAS,KACd;KACE,OAAO,MAAM,WAAW;KACxB;KACD,EACD,EAAE,QAAQ,KAAK,CAChB;SAED,QAAO,SAAS,KACd;IACE,OAAO;IACP;IACD,EACD,EAAE,QAAQ,KAAK,CAChB;WAEI,QAAQ;AACf,UAAO,SAAS,KACd,EAAE,SAAS,6BAA6B,EACxC,EAAE,QAAQ,KAAK,CAChB"}
@@ -1,4 +1,4 @@
1
- import { MediaCloudPluginOptions } from "../types/index.js";
1
+ import { MediaCloudPluginOptions } from "../types/index.mjs";
2
2
  import { Mux as Mux$1 } from "@mux/mux-node";
3
3
  import { PayloadHandler } from "payload";
4
4
 
@@ -10,4 +10,4 @@ interface GetMuxCreateUploadHandlerArgs {
10
10
  declare function getMuxCreateUploadHandler(args: GetMuxCreateUploadHandlerArgs): PayloadHandler;
11
11
  //#endregion
12
12
  export { getMuxCreateUploadHandler };
13
- //# sourceMappingURL=muxCreateUploadHandler.d.ts.map
13
+ //# sourceMappingURL=muxCreateUploadHandler.d.mts.map
@@ -1,5 +1,5 @@
1
- import { MediaCloudErrors } from "../types/errors.js";
2
- import { useErrorHandler } from "../hooks/useErrorHandler.js";
1
+ import { MediaCloudErrors } from "../types/errors.mjs";
2
+ import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
3
3
 
4
4
  //#region src/endpoints/muxCreateUploadHandler.ts
5
5
  function getMuxCreateUploadHandler(args) {
@@ -11,8 +11,7 @@ function getMuxCreateUploadHandler(args) {
11
11
  throwError(MediaCloudErrors.MUX_REQUEST_NO_JSON);
12
12
  throw new Error();
13
13
  }
14
- const body = req.json ? await req.json() : "";
15
- const { filename } = body;
14
+ const { filename } = req.json ? await req.json() : "";
16
15
  const mux = getMuxClient();
17
16
  const assetOptions = pluginOptions.mux?.assetOptions || {};
18
17
  const upload = await mux.video.uploads.create({
@@ -37,4 +36,4 @@ function getMuxCreateUploadHandler(args) {
37
36
 
38
37
  //#endregion
39
38
  export { getMuxCreateUploadHandler };
40
- //# sourceMappingURL=muxCreateUploadHandler.js.map
39
+ //# sourceMappingURL=muxCreateUploadHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muxCreateUploadHandler.mjs","names":[],"sources":["../../src/endpoints/muxCreateUploadHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\n\nimport type { PayloadHandler } from 'payload'\nimport { MediaCloudPluginOptions } from '../types'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\ninterface GetMuxCreateUploadHandlerArgs {\n getMuxClient: () => Mux\n pluginOptions: MediaCloudPluginOptions\n}\n\nexport function getMuxCreateUploadHandler(\n args: GetMuxCreateUploadHandlerArgs\n): PayloadHandler {\n const { getMuxClient, pluginOptions } = args\n\n return async (req) => {\n const { throwError, logError } = useErrorHandler()\n\n try {\n if (!req.json) {\n throwError(MediaCloudErrors.MUX_REQUEST_NO_JSON)\n throw new Error() // This will never execute but satisfies TypeScript\n }\n const body = req.json ? await req.json() : ''\n const { filename } = body\n const mux = getMuxClient()\n const assetOptions = pluginOptions.mux?.assetOptions || {}\n const upload = await mux.video.uploads.create({\n cors_origin: '*',\n new_asset_settings: {\n playback_policies: ['public'],\n meta: {\n title: filename,\n },\n ...assetOptions,\n },\n test: pluginOptions.mux?.testMode ?? false,\n })\n return Response.json({ url: upload.url, uploadId: upload.id })\n } catch (_error) {\n logError(MediaCloudErrors.MUX_CREATE_UPLOAD_ERROR)\n return Response.json(\n { message: 'Failed to create upload' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;AAYA,SAAgB,0BACd,MACgB;CAChB,MAAM,EAAE,cAAc,kBAAkB;AAExC,QAAO,OAAO,QAAQ;EACpB,MAAM,EAAE,YAAY,aAAa,iBAAiB;AAElD,MAAI;AACF,OAAI,CAAC,IAAI,MAAM;AACb,eAAW,iBAAiB,oBAAoB;AAChD,UAAM,IAAI,OAAO;;GAGnB,MAAM,EAAE,aADK,IAAI,OAAO,MAAM,IAAI,MAAM,GAAG;GAE3C,MAAM,MAAM,cAAc;GAC1B,MAAM,eAAe,cAAc,KAAK,gBAAgB,EAAE;GAC1D,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ,OAAO;IAC5C,aAAa;IACb,oBAAoB;KAClB,mBAAmB,CAAC,SAAS;KAC7B,MAAM,EACJ,OAAO,UACR;KACD,GAAG;KACJ;IACD,MAAM,cAAc,KAAK,YAAY;IACtC,CAAC;AACF,UAAO,SAAS,KAAK;IAAE,KAAK,OAAO;IAAK,UAAU,OAAO;IAAI,CAAC;WACvD,QAAQ;AACf,YAAS,iBAAiB,wBAAwB;AAClD,UAAO,SAAS,KACd,EAAE,SAAS,2BAA2B,EACtC,EAAE,QAAQ,KAAK,CAChB"}
@@ -8,4 +8,4 @@ interface GetMuxWebhookHandlerArgs {
8
8
  declare function getMuxWebhookHandler(args: GetMuxWebhookHandlerArgs): PayloadHandler;
9
9
  //#endregion
10
10
  export { getMuxWebhookHandler };
11
- //# sourceMappingURL=muxWebhookHandler.d.ts.map
11
+ //# sourceMappingURL=muxWebhookHandler.d.mts.map
@@ -46,4 +46,4 @@ async function updateMuxAsset(asset, payload) {
46
46
 
47
47
  //#endregion
48
48
  export { getMuxWebhookHandler };
49
- //# sourceMappingURL=muxWebhookHandler.js.map
49
+ //# sourceMappingURL=muxWebhookHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muxWebhookHandler.mjs","names":[],"sources":["../../src/endpoints/muxWebhookHandler.ts"],"sourcesContent":["import type { Mux } from '@mux/mux-node'\n\nimport type { BasePayload, PayloadHandler } from 'payload'\n\ninterface GetMuxWebhookHandlerArgs {\n getMuxClient: () => Mux\n}\n\nexport function getMuxWebhookHandler(\n args: GetMuxWebhookHandlerArgs\n): PayloadHandler {\n const { getMuxClient } = args\n\n return async (req) => {\n const mux = getMuxClient()\n\n try {\n const body = req.json ? await req.json() : ''\n const headers = req.headers\n\n // Verify the webhook signature\n mux.webhooks.verifySignature(body, headers)\n\n // Parse the request body\n const event = JSON.parse(body)\n\n // Handle the event\n console.log(`Received webhook event: ${event.type}`)\n\n switch (event.type) {\n case 'video.asset.created':\n console.log(`Asset created: ${event.object.id}`)\n break\n case 'video.asset.ready':\n await updateMuxAsset(event.object.id, req.payload)\n break\n case 'video.asset.errored':\n console.log(`Asset errored: ${event.object.id}`)\n break\n case 'video.asset.deleted':\n console.log(`Asset deleted: ${event.object.id}`)\n break\n case 'video.asset.static_renditions.ready':\n await updateMuxAsset(event.object.id, req.payload)\n console.log(`Static renditions ready: ${event.object.id}`)\n break\n case 'video.asset.static_renditions.deleted':\n console.log(`Static renditions deleted: ${event.object.id}`)\n break\n default:\n console.log(`Unknown event type: ${event.type}`)\n break\n }\n\n return Response.json(\n {\n message: 'Webhook received',\n },\n { status: 200 }\n )\n } catch (error) {\n return Response.json(\n {\n message: error instanceof Error ? error.message : String(error),\n },\n {\n status: 500,\n }\n )\n }\n }\n}\n\nasync function updateMuxAsset(\n asset: Mux.Video.Asset,\n payload: BasePayload\n): Promise<void> {\n console.log(`Updating Mux asset with ID: ${asset.id}`)\n console.log(`Asset status: ${payload}`)\n}\n"],"mappings":";AAQA,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,iBAAiB;AAEzB,QAAO,OAAO,QAAQ;EACpB,MAAM,MAAM,cAAc;AAE1B,MAAI;GACF,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI,MAAM,GAAG;GAC3C,MAAM,UAAU,IAAI;AAGpB,OAAI,SAAS,gBAAgB,MAAM,QAAQ;GAG3C,MAAM,QAAQ,KAAK,MAAM,KAAK;AAG9B,WAAQ,IAAI,2BAA2B,MAAM,OAAO;AAEpD,WAAQ,MAAM,MAAd;IACE,KAAK;AACH,aAAQ,IAAI,kBAAkB,MAAM,OAAO,KAAK;AAChD;IACF,KAAK;AACH,WAAM,eAAe,MAAM,OAAO,IAAI,IAAI,QAAQ;AAClD;IACF,KAAK;AACH,aAAQ,IAAI,kBAAkB,MAAM,OAAO,KAAK;AAChD;IACF,KAAK;AACH,aAAQ,IAAI,kBAAkB,MAAM,OAAO,KAAK;AAChD;IACF,KAAK;AACH,WAAM,eAAe,MAAM,OAAO,IAAI,IAAI,QAAQ;AAClD,aAAQ,IAAI,4BAA4B,MAAM,OAAO,KAAK;AAC1D;IACF,KAAK;AACH,aAAQ,IAAI,8BAA8B,MAAM,OAAO,KAAK;AAC5D;IACF;AACE,aAAQ,IAAI,uBAAuB,MAAM,OAAO;AAChD;;AAGJ,UAAO,SAAS,KACd,EACE,SAAS,oBACV,EACD,EAAE,QAAQ,KAAK,CAChB;WACM,OAAO;AACd,UAAO,SAAS,KACd,EACE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAChE,EACD,EACE,QAAQ,KACT,CACF;;;;AAKP,eAAe,eACb,OACA,SACe;AACf,SAAQ,IAAI,+BAA+B,MAAM,KAAK;AACtD,SAAQ,IAAI,iBAAiB,UAAU"}
@@ -0,0 +1,11 @@
1
+ import { S3Store } from "../tus/stores/s3/s3-store.mjs";
2
+ import { PayloadHandler } from "payload";
3
+
4
+ //#region src/endpoints/tusPostProcessorHandler.d.ts
5
+ interface GetTusPostProcessorHandlerArgs {
6
+ s3Store: S3Store;
7
+ }
8
+ declare function getTusPostProcessorHandler(args: GetTusPostProcessorHandlerArgs): PayloadHandler;
9
+ //#endregion
10
+ export { getTusPostProcessorHandler };
11
+ //# sourceMappingURL=tusPostProcessorHandler.d.mts.map
@@ -0,0 +1,48 @@
1
+ import { MediaCloudErrors } from "../types/errors.mjs";
2
+ import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
3
+ import { imageSize } from "image-size";
4
+
5
+ //#region src/endpoints/tusPostProcessorHandler.ts
6
+ function getTusPostProcessorHandler(args) {
7
+ const { s3Store } = args;
8
+ const { throwError, logError } = useErrorHandler();
9
+ return async function(req) {
10
+ try {
11
+ const { routeParams, payload } = req;
12
+ const filename = routeParams?.filename;
13
+ if (!filename) throwError(MediaCloudErrors.FILE_MISSING_NAME);
14
+ const decodedFilename = decodeURIComponent(filename);
15
+ const { docs } = await payload.find({
16
+ collection: "media",
17
+ where: { filename: { equals: decodedFilename } },
18
+ limit: 1,
19
+ pagination: false
20
+ });
21
+ const matchedId = docs[0]?.id;
22
+ if (!matchedId) throwError(MediaCloudErrors.FILE_NOT_FOUND);
23
+ const url = s3Store.getUrl(filename);
24
+ const arrayBuffer = await (await fetch(url)).arrayBuffer();
25
+ const { width, height } = imageSize(Buffer.from(arrayBuffer));
26
+ if (width && height) await payload.update({
27
+ collection: "media",
28
+ id: matchedId,
29
+ data: {
30
+ width,
31
+ height
32
+ }
33
+ });
34
+ return Response.json({
35
+ width,
36
+ height,
37
+ message: "dimensions updated"
38
+ }, { status: 200 });
39
+ } catch (_error) {
40
+ logError(MediaCloudErrors.FILE_DIMENSIONS_ERROR);
41
+ return Response.json({ message: "Failed to update dimensions" }, { status: 500 });
42
+ }
43
+ };
44
+ }
45
+
46
+ //#endregion
47
+ export { getTusPostProcessorHandler };
48
+ //# sourceMappingURL=tusPostProcessorHandler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tusPostProcessorHandler.mjs","names":[],"sources":["../../src/endpoints/tusPostProcessorHandler.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport { S3Store } from '../tus/stores/s3/s3-store'\nimport { imageSize } from 'image-size'\n\ninterface GetTusPostProcessorHandlerArgs {\n s3Store: S3Store\n}\n\nexport function getTusPostProcessorHandler(\n args: GetTusPostProcessorHandlerArgs\n): PayloadHandler {\n const { s3Store } = args\n const { throwError, logError } = useErrorHandler()\n\n return async function (req) {\n try {\n const { routeParams, payload } = req\n const filename = routeParams?.filename as string\n\n if (!filename) {\n throwError(MediaCloudErrors.FILE_MISSING_NAME)\n }\n\n const decodedFilename = decodeURIComponent(filename)\n\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n filename: {\n equals: decodedFilename,\n },\n },\n limit: 1,\n pagination: false,\n })\n\n const matchedId = docs[0]?.id\n\n if (!matchedId) {\n throwError(MediaCloudErrors.FILE_NOT_FOUND)\n }\n\n const url = s3Store.getUrl(filename)\n const response = await fetch(url)\n const arrayBuffer = await response.arrayBuffer()\n const buffer = Buffer.from(arrayBuffer)\n\n const dimensions = imageSize(buffer)\n const { width, height } = dimensions\n\n if (width && height) {\n await payload.update({\n collection: 'media',\n id: matchedId,\n data: {\n width,\n height,\n },\n })\n }\n\n return Response.json(\n { width, height, message: 'dimensions updated' },\n { status: 200 }\n )\n } catch (_error) {\n logError(MediaCloudErrors.FILE_DIMENSIONS_ERROR)\n return Response.json(\n { message: 'Failed to update dimensions' },\n { status: 500 }\n )\n }\n }\n}\n"],"mappings":";;;;;AAWA,SAAgB,2BACd,MACgB;CAChB,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,YAAY,aAAa,iBAAiB;AAElD,QAAO,eAAgB,KAAK;AAC1B,MAAI;GACF,MAAM,EAAE,aAAa,YAAY;GACjC,MAAM,WAAW,aAAa;AAE9B,OAAI,CAAC,SACH,YAAW,iBAAiB,kBAAkB;GAGhD,MAAM,kBAAkB,mBAAmB,SAAS;GAEpD,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;IAClC,YAAY;IACZ,OAAO,EACL,UAAU,EACR,QAAQ,iBACT,EACF;IACD,OAAO;IACP,YAAY;IACb,CAAC;GAEF,MAAM,YAAY,KAAK,IAAI;AAE3B,OAAI,CAAC,UACH,YAAW,iBAAiB,eAAe;GAG7C,MAAM,MAAM,QAAQ,OAAO,SAAS;GAEpC,MAAM,cAAc,OADH,MAAM,MAAM,IAAI,EACE,aAAa;GAIhD,MAAM,EAAE,OAAO,WADI,UAFJ,OAAO,KAAK,YAAY,CAEH;AAGpC,OAAI,SAAS,OACX,OAAM,QAAQ,OAAO;IACnB,YAAY;IACZ,IAAI;IACJ,MAAM;KACJ;KACA;KACD;IACF,CAAC;AAGJ,UAAO,SAAS,KACd;IAAE;IAAO;IAAQ,SAAS;IAAsB,EAChD,EAAE,QAAQ,KAAK,CAChB;WACM,QAAQ;AACf,YAAS,iBAAiB,sBAAsB;AAChD,UAAO,SAAS,KACd,EAAE,SAAS,+BAA+B,EAC1C,EAAE,QAAQ,KAAK,CAChB"}
@@ -1,4 +1,4 @@
1
- //#region ../error-handler/dist/index.js
1
+ //#region ../error-handler/dist/index.mjs
2
2
  /**
3
3
  * Creates a logger with configurable prefix, levels, and error/log sets
4
4
  * @param config - Configuration object containing prefix, level, error set, and log set
@@ -12,8 +12,6 @@ function createLogger(config) {
12
12
  errorEntryKeyMap.set(errorEntry, key);
13
13
  });
14
14
  class BaseError extends Error {
15
- key;
16
- errorCode;
17
15
  constructor({ message, key, errorCode }) {
18
16
  super(`[${prefix}] ${message}`);
19
17
  this.name = "BaseError";
@@ -30,8 +28,7 @@ function createLogger(config) {
30
28
  return;
31
29
  }
32
30
  const formattedMessage = formatMessage(errorEntry.message);
33
- const logLevel = overrideLevel ?? level;
34
- switch (logLevel) {
31
+ switch (overrideLevel ?? level) {
35
32
  case "WARNING":
36
33
  console.warn(formattedMessage);
37
34
  break;
@@ -56,9 +53,8 @@ function createLogger(config) {
56
53
  errorCode: 500
57
54
  });
58
55
  const errorCode = errorEntry.errorCode ?? 500;
59
- const errorKey = errorEntryKeyMap.get(errorEntry) || "UNKNOWN_ERROR";
60
56
  throw new BaseError({
61
- key: errorKey,
57
+ key: errorEntryKeyMap.get(errorEntry) || "UNKNOWN_ERROR",
62
58
  message: errorEntry.message,
63
59
  errorCode
64
60
  });
@@ -80,4 +76,4 @@ let LogLevel = /* @__PURE__ */ function(LogLevel$1) {
80
76
 
81
77
  //#endregion
82
78
  export { LogLevel, createLogger };
83
- //# sourceMappingURL=index.js.map
79
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../error-handler/dist/index.mjs"],"sourcesContent":["//#region src/createLogger.ts\n/**\n* Creates a logger with configurable prefix, levels, and error/log sets\n* @param config - Configuration object containing prefix, level, error set, and log set\n* @returns Object with logError, throwError, and log functions\n*/\nfunction createLogger(config) {\n\tconst { prefix, level, errors = {}, logs = {} } = config;\n\tconst logEntriesSet = new Set(Object.values(logs));\n\tconst errorEntryKeyMap = /* @__PURE__ */ new Map();\n\tObject.entries(errors).forEach(([key, errorEntry]) => {\n\t\terrorEntryKeyMap.set(errorEntry, key);\n\t});\n\tclass BaseError extends Error {\n\t\tconstructor({ message, key, errorCode }) {\n\t\t\tsuper(`[${prefix}] ${message}`);\n\t\t\tthis.name = \"BaseError\";\n\t\t\tthis.key = key;\n\t\t\tthis.errorCode = errorCode;\n\t\t}\n\t}\n\tfunction formatMessage(message) {\n\t\treturn `[${prefix}] ${message}`;\n\t}\n\tfunction logError(errorEntry, overrideLevel) {\n\t\tif (!errorEntry) {\n\t\t\tconsole.error(`[${prefix}] Invalid error entry provided`);\n\t\t\treturn;\n\t\t}\n\t\tconst formattedMessage = formatMessage(errorEntry.message);\n\t\tswitch (overrideLevel ?? level) {\n\t\t\tcase \"WARNING\":\n\t\t\t\tconsole.warn(formattedMessage);\n\t\t\t\tbreak;\n\t\t\tcase \"ERROR\":\n\t\t\t\tconsole.error(formattedMessage);\n\t\t\t\tbreak;\n\t\t\tdefault: console.error(formattedMessage);\n\t\t}\n\t}\n\tfunction log(logEntry) {\n\t\tif (!logEntry || !logEntriesSet.has(logEntry)) {\n\t\t\tconsole.error(`[${prefix}] Invalid log entry provided`);\n\t\t\treturn;\n\t\t}\n\t\tconst formattedMessage = formatMessage(logEntry.message);\n\t\tconsole.log(formattedMessage);\n\t}\n\tfunction throwError(errorEntry) {\n\t\tif (!errorEntry) throw new BaseError({\n\t\t\tkey: \"UNKNOWN_ERROR\",\n\t\t\tmessage: \"Invalid error entry provided\",\n\t\t\terrorCode: 500\n\t\t});\n\t\tconst errorCode = errorEntry.errorCode ?? 500;\n\t\tthrow new BaseError({\n\t\t\tkey: errorEntryKeyMap.get(errorEntry) || \"UNKNOWN_ERROR\",\n\t\t\tmessage: errorEntry.message,\n\t\t\terrorCode\n\t\t});\n\t}\n\treturn {\n\t\tlogError,\n\t\tthrowError,\n\t\tlog\n\t};\n}\n\n//#endregion\n//#region src/types.ts\n/**\n* Log level enum for categorizing log/error severity\n*/\nlet LogLevel = /* @__PURE__ */ function(LogLevel$1) {\n\tLogLevel$1[\"WARNING\"] = \"WARNING\";\n\tLogLevel$1[\"ERROR\"] = \"ERROR\";\n\treturn LogLevel$1;\n}({});\n\n//#endregion\nexport { LogLevel, createLogger };\n//# sourceMappingURL=index.mjs.map"],"mappings":";;;;;;AAMA,SAAS,aAAa,QAAQ;CAC7B,MAAM,EAAE,QAAQ,OAAO,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK;CAClD,MAAM,gBAAgB,IAAI,IAAI,OAAO,OAAO,KAAK,CAAC;CAClD,MAAM,mCAAmC,IAAI,KAAK;AAClD,QAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,KAAK,gBAAgB;AACrD,mBAAiB,IAAI,YAAY,IAAI;GACpC;CACF,MAAM,kBAAkB,MAAM;EAC7B,YAAY,EAAE,SAAS,KAAK,aAAa;AACxC,SAAM,IAAI,OAAO,IAAI,UAAU;AAC/B,QAAK,OAAO;AACZ,QAAK,MAAM;AACX,QAAK,YAAY;;;CAGnB,SAAS,cAAc,SAAS;AAC/B,SAAO,IAAI,OAAO,IAAI;;CAEvB,SAAS,SAAS,YAAY,eAAe;AAC5C,MAAI,CAAC,YAAY;AAChB,WAAQ,MAAM,IAAI,OAAO,gCAAgC;AACzD;;EAED,MAAM,mBAAmB,cAAc,WAAW,QAAQ;AAC1D,UAAQ,iBAAiB,OAAzB;GACC,KAAK;AACJ,YAAQ,KAAK,iBAAiB;AAC9B;GACD,KAAK;AACJ,YAAQ,MAAM,iBAAiB;AAC/B;GACD,QAAS,SAAQ,MAAM,iBAAiB;;;CAG1C,SAAS,IAAI,UAAU;AACtB,MAAI,CAAC,YAAY,CAAC,cAAc,IAAI,SAAS,EAAE;AAC9C,WAAQ,MAAM,IAAI,OAAO,8BAA8B;AACvD;;EAED,MAAM,mBAAmB,cAAc,SAAS,QAAQ;AACxD,UAAQ,IAAI,iBAAiB;;CAE9B,SAAS,WAAW,YAAY;AAC/B,MAAI,CAAC,WAAY,OAAM,IAAI,UAAU;GACpC,KAAK;GACL,SAAS;GACT,WAAW;GACX,CAAC;EACF,MAAM,YAAY,WAAW,aAAa;AAC1C,QAAM,IAAI,UAAU;GACnB,KAAK,iBAAiB,IAAI,WAAW,IAAI;GACzC,SAAS,WAAW;GACpB;GACA,CAAC;;AAEH,QAAO;EACN;EACA;EACA;EACA;;;;;AAQF,IAAI,WAA2B,yBAAS,YAAY;AACnD,YAAW,aAAa;AACxB,YAAW,WAAW;AACtB,QAAO;EACN,EAAE,CAAC"}
@@ -44,4 +44,4 @@ declare function useEmitter(): {
44
44
  };
45
45
  //#endregion
46
46
  export { emitter, useEmitter };
47
- //# sourceMappingURL=useEmitter.d.ts.map
47
+ //# sourceMappingURL=useEmitter.d.mts.map
@@ -16,4 +16,4 @@ function useEmitter() {
16
16
 
17
17
  //#endregion
18
18
  export { emitter, useEmitter };
19
- //# sourceMappingURL=useEmitter.js.map
19
+ //# sourceMappingURL=useEmitter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEmitter.mjs","names":[],"sources":["../../src/hooks/useEmitter.ts"],"sourcesContent":["import mitt from 'mitt'\n\ntype EmitterEvents = {\n 'add-upload': {\n id: string\n filename: string\n polling?: boolean\n pollingUrl?: string\n }\n 'update-upload': { id: string; progress: number }\n 'remove-upload': { id: string }\n 'upload-completed': { id: string }\n 'upload-errored': { id: string; error: string }\n}\n\nconst emitter = mitt<EmitterEvents>()\n\n/**\n * Hook to access the global event emitter for upload management\n * @returns An object with emitter methods (on, off, emit)\n */\nfunction useEmitter() {\n return {\n on: emitter.on,\n off: emitter.off,\n emit: emitter.emit,\n }\n}\n\nexport { useEmitter, emitter }\n"],"mappings":";;;AAeA,MAAM,UAAU,MAAqB;;;;;AAMrC,SAAS,aAAa;AACpB,QAAO;EACL,IAAI,QAAQ;EACZ,KAAK,QAAQ;EACb,MAAM,QAAQ;EACf"}