@maas/payload-plugin-media-cloud 0.0.4 → 0.0.5
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/dist/components/upload-handler/upload-handler.js +0 -2
- package/dist/components/upload-handler/upload-handler.js.map +1 -1
- package/dist/error-handler/dist/index.js +9 -10
- package/dist/error-handler/dist/index.js.map +1 -1
- package/dist/plugin.js +5 -3
- package/dist/plugin.js.map +1 -1
- package/dist/types/index.d.ts +4 -3
- package/package.json +1 -1
|
@@ -101,8 +101,6 @@ async function tusUpload(args) {
|
|
|
101
101
|
const filename = file.name;
|
|
102
102
|
const filetype = file.type;
|
|
103
103
|
const filesize = file.size.toString();
|
|
104
|
-
console.debug(`Starting TUS upload for file: ${filename}`);
|
|
105
|
-
console.debug(`Server URL: ${serverURL}${apiRoute}/uploads`);
|
|
106
104
|
return new Promise((resolve) => {
|
|
107
105
|
const upload = new tus.Upload(file, {
|
|
108
106
|
endpoint: `${serverURL}${apiRoute}/uploads`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-handler.js","names":["uploadUrl?: string | null","args: UploadArgs","uploadArgs: UploadArgs"],"sources":["../../../src/components/upload-handler/upload-handler.tsx"],"sourcesContent":["'use client'\n\nimport * as upchunk from '@mux/upchunk'\nimport * as tus from 'tus-js-client'\n\nimport { toast } from '@payloadcms/ui'\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nimport { MediaCloudError } from '../../types/errors'\nimport { emitter } from '../../hooks/useEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport { isVideo, getFileType, sanitizeFilename } from '../../utils/file'\n\ninterface UploadArgs {\n serverURL: string\n apiRoute: string\n file: File\n mimeType: string\n updateFilename: (filename: string) => void\n}\n\ninterface UploadResult {\n uploadId: string\n mimeType: string\n storage: 'mux' | 's3'\n}\n\ninterface MuxCreateUploadResponse {\n url: string\n uploadId: string\n}\n\nconst { logError, throwError } = useErrorHandler()\n\nconst MUX_CHUNK_SIZE = 30720\nconst TUS_CHUNK_SIZE = 1024 * 1024\nconst TUS_RETRY_DELAYS = [0, 1000, 2000, 5000]\n\n/**\n * Utility function to parse upload ID from URL\n * @param uploadUrl - The upload URL to parse\n * @returns The extracted upload ID or empty string if parsing fails\n */\nfunction parseUploadId(uploadUrl?: string | null): string {\n if (!uploadUrl) {\n logError(MediaCloudError.UPLOAD_NO_URL)\n return ''\n }\n const url = new URL(uploadUrl)\n return url.pathname.split('/').pop() || ''\n}\n\n/**\n * Handles Mux video upload with progress tracking\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function muxUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { file, serverURL, apiRoute, mimeType, updateFilename } = args\n\n const filename = sanitizeFilename(file.name)\n const getUploadUrlEndpoint = `${serverURL}${apiRoute}/mux/upload`\n const getAssetEndpoint = `${serverURL}${apiRoute}/mux/asset`\n\n updateFilename(filename)\n\n try {\n // Request upload URL from Mux\n const response = await fetch(getUploadUrlEndpoint, {\n body: JSON.stringify({ filename, mimeType }),\n credentials: 'include',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n const { url, uploadId } = (await response.json()) as MuxCreateUploadResponse\n\n // Create upchunk uploader\n const uploader = await upchunk.createUpload({\n endpoint: url,\n file,\n chunkSize: MUX_CHUNK_SIZE,\n })\n\n // Add upload to tracker\n emitter.emit('add-upload', {\n id: uploadId,\n filename,\n polling: false,\n pollingUrl: getAssetEndpoint,\n })\n\n // Set up event handlers\n uploader.on('error', () => {\n logError(MediaCloudError.MUX_UPLOAD_ERROR)\n toast.error('Video upload failed')\n emitter.emit('remove-upload', { id: uploadId })\n })\n\n uploader.on('progress', (progress) => {\n emitter.emit('update-upload', {\n id: uploadId,\n progress: progress.detail,\n })\n })\n\n uploader.on('success', () => {\n emitter.emit('upload-completed', { id: uploadId })\n })\n\n return {\n uploadId,\n mimeType,\n storage: 'mux',\n }\n } catch (_error) {\n logError(MediaCloudError.MUX_DIRECT_UPLOAD_ERROR)\n toast.error('Video upload failed')\n return null\n }\n}\n\n/**\n * Handles TUS file upload with resumable capabilities\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function tusUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { apiRoute, serverURL, file, mimeType, updateFilename } = args\n\n const filename = file.name\n const filetype = file.type\n const filesize = file.size.toString()\n\n
|
|
1
|
+
{"version":3,"file":"upload-handler.js","names":["uploadUrl?: string | null","args: UploadArgs","uploadArgs: UploadArgs"],"sources":["../../../src/components/upload-handler/upload-handler.tsx"],"sourcesContent":["'use client'\n\nimport * as upchunk from '@mux/upchunk'\nimport * as tus from 'tus-js-client'\n\nimport { toast } from '@payloadcms/ui'\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nimport { MediaCloudError } from '../../types/errors'\nimport { emitter } from '../../hooks/useEmitter'\nimport { useErrorHandler } from '../../hooks/useErrorHandler'\nimport { isVideo, getFileType, sanitizeFilename } from '../../utils/file'\n\ninterface UploadArgs {\n serverURL: string\n apiRoute: string\n file: File\n mimeType: string\n updateFilename: (filename: string) => void\n}\n\ninterface UploadResult {\n uploadId: string\n mimeType: string\n storage: 'mux' | 's3'\n}\n\ninterface MuxCreateUploadResponse {\n url: string\n uploadId: string\n}\n\nconst { logError, throwError } = useErrorHandler()\n\nconst MUX_CHUNK_SIZE = 30720\nconst TUS_CHUNK_SIZE = 1024 * 1024\nconst TUS_RETRY_DELAYS = [0, 1000, 2000, 5000]\n\n/**\n * Utility function to parse upload ID from URL\n * @param uploadUrl - The upload URL to parse\n * @returns The extracted upload ID or empty string if parsing fails\n */\nfunction parseUploadId(uploadUrl?: string | null): string {\n if (!uploadUrl) {\n logError(MediaCloudError.UPLOAD_NO_URL)\n return ''\n }\n const url = new URL(uploadUrl)\n return url.pathname.split('/').pop() || ''\n}\n\n/**\n * Handles Mux video upload with progress tracking\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function muxUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { file, serverURL, apiRoute, mimeType, updateFilename } = args\n\n const filename = sanitizeFilename(file.name)\n const getUploadUrlEndpoint = `${serverURL}${apiRoute}/mux/upload`\n const getAssetEndpoint = `${serverURL}${apiRoute}/mux/asset`\n\n updateFilename(filename)\n\n try {\n // Request upload URL from Mux\n const response = await fetch(getUploadUrlEndpoint, {\n body: JSON.stringify({ filename, mimeType }),\n credentials: 'include',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n const { url, uploadId } = (await response.json()) as MuxCreateUploadResponse\n\n // Create upchunk uploader\n const uploader = await upchunk.createUpload({\n endpoint: url,\n file,\n chunkSize: MUX_CHUNK_SIZE,\n })\n\n // Add upload to tracker\n emitter.emit('add-upload', {\n id: uploadId,\n filename,\n polling: false,\n pollingUrl: getAssetEndpoint,\n })\n\n // Set up event handlers\n uploader.on('error', () => {\n logError(MediaCloudError.MUX_UPLOAD_ERROR)\n toast.error('Video upload failed')\n emitter.emit('remove-upload', { id: uploadId })\n })\n\n uploader.on('progress', (progress) => {\n emitter.emit('update-upload', {\n id: uploadId,\n progress: progress.detail,\n })\n })\n\n uploader.on('success', () => {\n emitter.emit('upload-completed', { id: uploadId })\n })\n\n return {\n uploadId,\n mimeType,\n storage: 'mux',\n }\n } catch (_error) {\n logError(MediaCloudError.MUX_DIRECT_UPLOAD_ERROR)\n toast.error('Video upload failed')\n return null\n }\n}\n\n/**\n * Handles TUS file upload with resumable capabilities\n * @param args - The upload arguments including file, server URL, and callbacks\n * @returns Promise that resolves to upload result or null if upload fails\n */\nasync function tusUpload(args: UploadArgs): Promise<UploadResult | null> {\n const { apiRoute, serverURL, file, mimeType, updateFilename } = args\n\n const filename = file.name\n const filetype = file.type\n const filesize = file.size.toString()\n\n return new Promise((resolve) => {\n const upload = new tus.Upload(file, {\n endpoint: `${serverURL}${apiRoute}/uploads`,\n retryDelays: TUS_RETRY_DELAYS,\n chunkSize: TUS_CHUNK_SIZE,\n metadata: {\n filename,\n filetype,\n filesize,\n contentType: filetype,\n contentDisposition: 'inline',\n contentLength: filesize,\n },\n onError: () => {\n logError(MediaCloudError.TUS_UPLOAD_ERROR)\n toast.error('File upload failed')\n resolve(null)\n },\n onProgress: (bytesUploaded, bytesTotal) => {\n const percentage = Math.round((bytesUploaded / bytesTotal) * 100)\n const uploadId = parseUploadId(upload?.url)\n emitter.emit('update-upload', {\n id: uploadId,\n progress: percentage,\n })\n },\n onSuccess: () => {\n const uploadId = parseUploadId(upload?.url)\n emitter.emit('upload-completed', { id: uploadId })\n },\n onUploadUrlAvailable: () => {\n const uploadId = parseUploadId(upload?.url)\n updateFilename(uploadId)\n emitter.emit('add-upload', { id: uploadId, filename })\n resolve({\n uploadId,\n mimeType,\n storage: 's3',\n })\n },\n })\n\n upload.start()\n })\n}\n\nexport const UploadHandler = createClientUploadHandler({\n handler: async (args) => {\n const { serverURL, apiRoute, file, updateFilename } = args\n\n try {\n const mimeType = await getFileType(file)\n\n if (!mimeType) {\n throwError(MediaCloudError.FILE_TYPE_UNKNOWN)\n return null\n }\n\n const isVideoFile = await isVideo(file)\n const uploadArgs: UploadArgs = {\n file,\n serverURL,\n apiRoute,\n mimeType,\n updateFilename,\n }\n\n if (isVideoFile) {\n return await muxUpload(uploadArgs)\n } else {\n return await tusUpload(uploadArgs)\n }\n } catch (_error) {\n logError(MediaCloudError.UPLOAD_HANDLER_ERROR)\n toast.error('Upload failed')\n return null\n }\n },\n})\n"],"mappings":"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"}
|
|
@@ -14,12 +14,11 @@ function createErrorHandler(config) {
|
|
|
14
14
|
this.key = key;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
function formatMessage(
|
|
18
|
-
const message = errors[errorKey] || `Unknown error: ${String(errorKey)}`;
|
|
17
|
+
function formatMessage(message) {
|
|
19
18
|
return `[${prefix}] ${message}`;
|
|
20
19
|
}
|
|
21
|
-
function logError(
|
|
22
|
-
const formattedMessage = formatMessage(
|
|
20
|
+
function logError(message, overrideLevel) {
|
|
21
|
+
const formattedMessage = formatMessage(message);
|
|
23
22
|
const logLevel = overrideLevel ?? level;
|
|
24
23
|
switch (logLevel) {
|
|
25
24
|
case "LOG":
|
|
@@ -34,15 +33,15 @@ function createErrorHandler(config) {
|
|
|
34
33
|
default: console.error(formattedMessage);
|
|
35
34
|
}
|
|
36
35
|
}
|
|
37
|
-
function logConsole(
|
|
38
|
-
const formattedMessage = formatMessage(
|
|
36
|
+
function logConsole(message) {
|
|
37
|
+
const formattedMessage = formatMessage(message);
|
|
39
38
|
console.log(formattedMessage);
|
|
40
39
|
}
|
|
41
|
-
function throwError(
|
|
42
|
-
const
|
|
40
|
+
function throwError(message) {
|
|
41
|
+
const key = (Object.keys(errors).find((k) => errors[k] === message) ?? "").toString();
|
|
43
42
|
throw new BaseError({
|
|
44
|
-
key
|
|
45
|
-
message
|
|
43
|
+
key,
|
|
44
|
+
message
|
|
46
45
|
});
|
|
47
46
|
}
|
|
48
47
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../error-handler/dist/index.js"],"sourcesContent":["//#region src/createErrorHandler.ts\n/**\n* Creates an error handler with configurable prefix and error sets\n* @param config - Configuration object containing prefix, level, and error set\n* @returns Object with logError and throwError functions\n*/\nfunction createErrorHandler(config) {\n\tconst { prefix, level, errors } = config;\n\tclass BaseError extends Error {\n\t\tkey;\n\t\tconstructor({ message, key }) {\n\t\t\tsuper(`[${prefix}] ${message}`);\n\t\t\tthis.name = \"BaseError\";\n\t\t\tthis.key = key;\n\t\t}\n\t}\n\tfunction formatMessage(
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../error-handler/dist/index.js"],"sourcesContent":["//#region src/createErrorHandler.ts\n/**\n* Creates an error handler with configurable prefix and error sets\n* @param config - Configuration object containing prefix, level, and error set\n* @returns Object with logError and throwError functions\n*/\nfunction createErrorHandler(config) {\n\tconst { prefix, level, errors } = config;\n\tclass BaseError extends Error {\n\t\tkey;\n\t\tconstructor({ message, key }) {\n\t\t\tsuper(`[${prefix}] ${message}`);\n\t\t\tthis.name = \"BaseError\";\n\t\t\tthis.key = key;\n\t\t}\n\t}\n\tfunction formatMessage(message) {\n\t\treturn `[${prefix}] ${message}`;\n\t}\n\tfunction logError(message, overrideLevel) {\n\t\tconst formattedMessage = formatMessage(message);\n\t\tconst logLevel = overrideLevel ?? level;\n\t\tswitch (logLevel) {\n\t\t\tcase \"LOG\":\n\t\t\t\tconsole.log(formattedMessage);\n\t\t\t\tbreak;\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 logConsole(message) {\n\t\tconst formattedMessage = formatMessage(message);\n\t\tconsole.log(formattedMessage);\n\t}\n\tfunction throwError(message) {\n\t\tconst key = (Object.keys(errors).find((k) => errors[k] === message) ?? \"\").toString();\n\t\tthrow new BaseError({\n\t\t\tkey,\n\t\t\tmessage\n\t\t});\n\t}\n\treturn {\n\t\tlogError,\n\t\tthrowError,\n\t\tlogConsole\n\t};\n}\n\n//#endregion\n//#region src/types.ts\n/**\n* Error level enum for categorizing error severity\n*/\nlet ErrorLevel = /* @__PURE__ */ function(ErrorLevel$1) {\n\tErrorLevel$1[\"LOG\"] = \"LOG\";\n\tErrorLevel$1[\"WARNING\"] = \"WARNING\";\n\tErrorLevel$1[\"ERROR\"] = \"ERROR\";\n\treturn ErrorLevel$1;\n}({});\n\n//#endregion\nexport { ErrorLevel, createErrorHandler };\n//# sourceMappingURL=index.js.map"],"mappings":";;;;;;AAMA,SAAS,mBAAmB,QAAQ;CACnC,MAAM,EAAE,QAAQ,OAAO,QAAQ,GAAG;CAClC,MAAM,kBAAkB,MAAM;EAC7B;EACA,YAAY,EAAE,SAAS,KAAK,EAAE;GAC7B,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC;GAC/B,KAAK,OAAO;GACZ,KAAK,MAAM;EACX;CACD;CACD,SAAS,cAAc,SAAS;AAC/B,SAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS;CAC/B;CACD,SAAS,SAAS,SAAS,eAAe;EACzC,MAAM,mBAAmB,cAAc,QAAQ;EAC/C,MAAM,WAAW,iBAAiB;AAClC,UAAQ,UAAR;GACC,KAAK;IACJ,QAAQ,IAAI,iBAAiB;AAC7B;GACD,KAAK;IACJ,QAAQ,KAAK,iBAAiB;AAC9B;GACD,KAAK;IACJ,QAAQ,MAAM,iBAAiB;AAC/B;GACD,SAAS,QAAQ,MAAM,iBAAiB;EACxC;CACD;CACD,SAAS,WAAW,SAAS;EAC5B,MAAM,mBAAmB,cAAc,QAAQ;EAC/C,QAAQ,IAAI,iBAAiB;CAC7B;CACD,SAAS,WAAW,SAAS;EAC5B,MAAM,OAAO,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,OAAO,OAAO,QAAQ,IAAI,IAAI,UAAU;AACrF,QAAM,IAAI,UAAU;GACnB;GACA;EACA;CACD;AACD,QAAO;EACN;EACA;EACA;CACA;AACD;;;;AAOD,IAAI,6BAA6B,SAAS,cAAc;CACvD,aAAa,SAAS;CACtB,aAAa,aAAa;CAC1B,aAAa,WAAW;AACxB,QAAO;AACP,EAAC,CAAE,EAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -62,7 +62,7 @@ function createS3Store(s3Config) {
|
|
|
62
62
|
* @returns A configured TusServer instance
|
|
63
63
|
*/
|
|
64
64
|
function createTusServer(args) {
|
|
65
|
-
const { config, s3Store } = args;
|
|
65
|
+
const { config, s3Store, pluginOptions } = args;
|
|
66
66
|
return new Server({
|
|
67
67
|
datastore: s3Store,
|
|
68
68
|
namingFunction: async (req, metadata) => {
|
|
@@ -79,7 +79,8 @@ function createTusServer(args) {
|
|
|
79
79
|
return metadata?.filename || generateUniqueFilename("");
|
|
80
80
|
}
|
|
81
81
|
},
|
|
82
|
-
path: "/api/uploads"
|
|
82
|
+
path: "/api/uploads",
|
|
83
|
+
respectForwardedHeaders: pluginOptions.s3.respectForwardedHeaders ?? false
|
|
83
84
|
});
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
@@ -188,7 +189,8 @@ function mediaCloudPlugin(pluginOptions) {
|
|
|
188
189
|
const s3Store = createS3Store(pluginOptions.s3);
|
|
189
190
|
const tusServer = createTusServer({
|
|
190
191
|
config,
|
|
191
|
-
s3Store
|
|
192
|
+
s3Store,
|
|
193
|
+
pluginOptions
|
|
192
194
|
});
|
|
193
195
|
const mediaCollection = getMediaCollection({ s3Store });
|
|
194
196
|
if (isPluginDisabled) return config;
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":["muxClient: Mux | null","muxConfig: MediaCloudPluginOptions['mux']","s3Config: MediaCloudPluginOptions['s3']","args: CreateTusServerArgs","TusServer","tusServer: TusServer","req: PayloadRequest","args: CreateMuxEndpointsArgs","pluginOptions: MediaCloudPluginOptions","config: Config","mappedConfig: Config"],"sources":["../src/plugin.ts"],"sourcesContent":["import Mux from '@mux/mux-node'\n\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\nimport { getPayload, sanitizeConfig } from 'payload'\nimport { Server as TusServer, type DataStore } from '@tus/server'\n\nimport { MediaCloudError } from './types/errors'\nimport { useErrorHandler } from './hooks/useErrorHandler'\nimport { getStorageAdapter } from './adapter/storageAdapter'\nimport { getMediaCollection } from './collections/mediaCollection'\nimport { getMuxAssetHandler } from './endpoints/muxAssetHandler'\nimport { getMuxCreateUploadHandler } from './endpoints/muxCreateUploadHandler'\nimport { getMuxWebhookHandler } from './endpoints/muxWebhookHandler'\nimport { S3Store } from './tus/stores/s3/s3-store'\nimport { generateUniqueFilename } from './utils/file'\n\nimport type { Config, PayloadRequest } from 'payload'\nimport type { MediaCloudPluginOptions } from './types'\n\ninterface CreateTusServerArgs {\n config: Config\n s3Store: DataStore\n}\n\ninterface CreateMuxEndpointsArgs {\n getMuxClient: () => Mux\n pluginOptions: MediaCloudPluginOptions\n}\n\nconst { logError, throwError } = useErrorHandler()\n\nlet muxClient: Mux | null = null\n\n/**\n * Validates Mux configuration options\n * @param muxConfig - The Mux configuration to validate\n * @throws {Error} When required Mux configuration is missing\n */\nfunction validateMuxConfig(muxConfig: MediaCloudPluginOptions['mux']): void {\n if (!muxConfig?.tokenId || !muxConfig?.tokenSecret) {\n throwError(MediaCloudError.MUX_CONFIG_MISSING)\n }\n}\n\n/**\n * Creates a new Mux client instance\n * @param muxConfig - The Mux configuration options\n * @returns A configured Mux client\n */\nfunction createMuxClient(muxConfig: MediaCloudPluginOptions['mux']): Mux {\n // Create and return Mux client instance\n return new Mux({\n tokenId: muxConfig.tokenId,\n tokenSecret: muxConfig.tokenSecret,\n webhookSecret: muxConfig.webhookSecret,\n })\n}\n\n/**\n * Creates and configures an S3Store instance\n * @param s3Config - The S3 configuration options\n * @returns A configured S3Store instance\n * @throws {Error} When required S3 configuration is missing\n */\nfunction createS3Store(s3Config: MediaCloudPluginOptions['s3']): S3Store {\n // Validate S3 configuration\n if (\n !s3Config?.bucket ||\n !s3Config?.region ||\n !s3Config?.accessKeyId ||\n !s3Config?.secretAccessKey\n ) {\n throwError(MediaCloudError.S3_CONFIG_MISSING)\n }\n\n // Create and return S3Store instance\n return new S3Store({\n s3ClientConfig: {\n acl: 'public-read',\n bucket: s3Config.bucket,\n credentials: {\n accessKeyId: s3Config.accessKeyId,\n secretAccessKey: s3Config.secretAccessKey,\n },\n endpoint: s3Config.endpoint,\n forcePathStyle: true,\n region: s3Config.region,\n },\n })\n}\n\n/**\n * Creates a TUS server instance with S3 storage\n * @param args - The arguments for creating the TUS server\n * @returns A configured TusServer instance\n */\nfunction createTusServer(args: CreateTusServerArgs): TusServer {\n const { config, s3Store } = args\n\n return new TusServer({\n datastore: s3Store,\n namingFunction: async (req, metadata) => {\n try {\n // Get Payload instance\n const payload = await getPayload({\n config: sanitizeConfig(config),\n })\n\n // Check if a file with the same name already exists in the media collection\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n filename: {\n equals: metadata?.filename || '',\n },\n },\n })\n\n // If a file with the same name exists, generate a unique filename\n if (docs.length > 0) {\n return generateUniqueFilename(metadata?.filename ?? '')\n } else {\n // If no file with the same name exists, return the original filename\n return metadata?.filename || generateUniqueFilename('')\n }\n } catch (_error) {\n // If an error occurs, log it and return the original filename\n logError(MediaCloudError.NAMING_FUNCTION_ERROR)\n return metadata?.filename || generateUniqueFilename('')\n }\n },\n path: '/api/uploads',\n })\n}\n\n/**\n * Creates TUS upload endpoints for file handling\n * @param tusServer - The TUS server instance\n * @returns An array of endpoint configurations\n */\nfunction createTusEndpoints(tusServer: TusServer) {\n /**\n * Handles TUS requests through the server\n * @param req - The payload request object\n * @returns The server response\n */\n function tusHandler(req: PayloadRequest) {\n return tusServer.handleWeb(req as Request)\n }\n\n return [\n { handler: tusHandler, method: 'options' as const, path: '/uploads' },\n { handler: tusHandler, method: 'post' as const, path: '/uploads' },\n { handler: tusHandler, method: 'get' as const, path: '/uploads/:id' },\n { handler: tusHandler, method: 'put' as const, path: '/uploads/:id' },\n { handler: tusHandler, method: 'patch' as const, path: '/uploads/:id' },\n { handler: tusHandler, method: 'delete' as const, path: '/uploads/:id' },\n ]\n}\n\n/**\n * Creates Mux-related endpoints for asset handling\n * @param args - The arguments for creating Mux endpoints\n * @returns An array of Mux endpoint configurations\n */\nfunction createMuxEndpoints(args: CreateMuxEndpointsArgs) {\n const { getMuxClient, pluginOptions } = args\n return [\n {\n handler: getMuxWebhookHandler({ getMuxClient }),\n method: 'get' as const,\n path: '/mux/webhook',\n },\n {\n handler: getMuxCreateUploadHandler({ getMuxClient, pluginOptions }),\n method: 'post' as const,\n path: '/mux/upload',\n },\n {\n handler: getMuxAssetHandler({ getMuxClient }),\n method: 'get' as const,\n path: '/mux/asset',\n },\n ]\n}\n\n/**\n * Media Cloud Plugin for Payload CMS\n * Provides file upload capabilities using S3 storage and Mux video processing\n * @param pluginOptions - Configuration options for the plugin\n * @returns A function that configures the Payload config\n */\nexport function mediaCloudPlugin(pluginOptions: MediaCloudPluginOptions) {\n return function (config: Config): Config {\n if (!pluginOptions) {\n logError(MediaCloudError.PLUGIN_NOT_CONFIGURED)\n return config\n }\n\n const isPluginDisabled = pluginOptions.enabled === false\n\n /**\n * Gets or creates a Mux client instance\n * @returns The Mux client instance\n */\n function getMuxClient(): Mux {\n // Return existing Mux client if already created\n if (muxClient) {\n return muxClient\n }\n // Create and return a new Mux client\n return createMuxClient(pluginOptions.mux)\n }\n\n // Validate Mux configuration\n if (pluginOptions.mux) {\n validateMuxConfig(pluginOptions.mux)\n muxClient = getMuxClient()\n } else {\n logError(MediaCloudError.MUX_CONFIG_INCOMPLETE)\n muxClient = null\n }\n\n const s3Store = createS3Store(pluginOptions.s3)\n const tusServer = createTusServer({ config, s3Store })\n const mediaCollection = getMediaCollection({ s3Store })\n\n if (isPluginDisabled) {\n return config\n }\n\n // Initialize client uploads\n initClientUploads({\n clientHandler:\n '@maas/payload-plugin-media-cloud/components#UploadHandler',\n collections: {\n media: {\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n config,\n enabled: true,\n serverHandler: () => {\n return Response.json(\n { message: 'Server handler is not implemented' },\n { status: 501 }\n )\n },\n serverHandlerPath: '/media-cloud/upload',\n })\n\n const cloudStorageConfig = {\n collections: {\n media: {\n adapter: getStorageAdapter({ getMuxClient, pluginOptions, s3Store }),\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n }\n\n const mappedConfig: Config = {\n ...config,\n admin: {\n ...(config.admin ?? {}),\n components: {\n ...(config.admin?.components ?? {}),\n providers: [\n '@maas/payload-plugin-media-cloud/components#UploadManagerProvider',\n ...(config.admin?.components?.providers ?? []),\n ],\n },\n },\n collections: [...(config.collections ?? []), mediaCollection],\n endpoints: [\n ...(config.endpoints ?? []),\n ...createTusEndpoints(tusServer),\n ...createMuxEndpoints({ getMuxClient, pluginOptions }),\n ],\n }\n\n return cloudStoragePlugin(cloudStorageConfig)(mappedConfig)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","names":["muxClient: Mux | null","muxConfig: MediaCloudPluginOptions['mux']","s3Config: MediaCloudPluginOptions['s3']","args: CreateTusServerArgs","TusServer","tusServer: TusServer","req: PayloadRequest","args: CreateMuxEndpointsArgs","pluginOptions: MediaCloudPluginOptions","config: Config","mappedConfig: Config"],"sources":["../src/plugin.ts"],"sourcesContent":["import Mux from '@mux/mux-node'\n\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\nimport { getPayload, sanitizeConfig } from 'payload'\nimport { Server as TusServer, type DataStore } from '@tus/server'\n\nimport { MediaCloudError } from './types/errors'\nimport { useErrorHandler } from './hooks/useErrorHandler'\nimport { getStorageAdapter } from './adapter/storageAdapter'\nimport { getMediaCollection } from './collections/mediaCollection'\nimport { getMuxAssetHandler } from './endpoints/muxAssetHandler'\nimport { getMuxCreateUploadHandler } from './endpoints/muxCreateUploadHandler'\nimport { getMuxWebhookHandler } from './endpoints/muxWebhookHandler'\nimport { S3Store } from './tus/stores/s3/s3-store'\nimport { generateUniqueFilename } from './utils/file'\n\nimport type { Config, PayloadRequest } from 'payload'\nimport type { MediaCloudPluginOptions } from './types'\n\ninterface CreateTusServerArgs {\n config: Config\n s3Store: DataStore\n pluginOptions: MediaCloudPluginOptions\n}\n\ninterface CreateMuxEndpointsArgs {\n getMuxClient: () => Mux\n pluginOptions: MediaCloudPluginOptions\n}\n\nconst { logError, throwError } = useErrorHandler()\n\nlet muxClient: Mux | null = null\n\n/**\n * Validates Mux configuration options\n * @param muxConfig - The Mux configuration to validate\n * @throws {Error} When required Mux configuration is missing\n */\nfunction validateMuxConfig(muxConfig: MediaCloudPluginOptions['mux']): void {\n if (!muxConfig?.tokenId || !muxConfig?.tokenSecret) {\n throwError(MediaCloudError.MUX_CONFIG_MISSING)\n }\n}\n\n/**\n * Creates a new Mux client instance\n * @param muxConfig - The Mux configuration options\n * @returns A configured Mux client\n */\nfunction createMuxClient(muxConfig: MediaCloudPluginOptions['mux']): Mux {\n // Create and return Mux client instance\n return new Mux({\n tokenId: muxConfig.tokenId,\n tokenSecret: muxConfig.tokenSecret,\n webhookSecret: muxConfig.webhookSecret,\n })\n}\n\n/**\n * Creates and configures an S3Store instance\n * @param s3Config - The S3 configuration options\n * @returns A configured S3Store instance\n * @throws {Error} When required S3 configuration is missing\n */\nfunction createS3Store(s3Config: MediaCloudPluginOptions['s3']): S3Store {\n // Validate S3 configuration\n if (\n !s3Config?.bucket ||\n !s3Config?.region ||\n !s3Config?.accessKeyId ||\n !s3Config?.secretAccessKey\n ) {\n throwError(MediaCloudError.S3_CONFIG_MISSING)\n }\n\n // Create and return S3Store instance\n return new S3Store({\n s3ClientConfig: {\n acl: 'public-read',\n bucket: s3Config.bucket,\n credentials: {\n accessKeyId: s3Config.accessKeyId,\n secretAccessKey: s3Config.secretAccessKey,\n },\n endpoint: s3Config.endpoint,\n forcePathStyle: true,\n region: s3Config.region,\n },\n })\n}\n\n/**\n * Creates a TUS server instance with S3 storage\n * @param args - The arguments for creating the TUS server\n * @returns A configured TusServer instance\n */\nfunction createTusServer(args: CreateTusServerArgs): TusServer {\n const { config, s3Store, pluginOptions } = args\n\n return new TusServer({\n datastore: s3Store,\n namingFunction: async (req, metadata) => {\n try {\n // Get Payload instance\n const payload = await getPayload({\n config: sanitizeConfig(config),\n })\n\n // Check if a file with the same name already exists in the media collection\n const { docs } = await payload.find({\n collection: 'media',\n where: {\n filename: {\n equals: metadata?.filename || '',\n },\n },\n })\n\n // If a file with the same name exists, generate a unique filename\n if (docs.length > 0) {\n return generateUniqueFilename(metadata?.filename ?? '')\n } else {\n // If no file with the same name exists, return the original filename\n return metadata?.filename || generateUniqueFilename('')\n }\n } catch (_error) {\n // If an error occurs, log it and return the original filename\n logError(MediaCloudError.NAMING_FUNCTION_ERROR)\n return metadata?.filename || generateUniqueFilename('')\n }\n },\n path: '/api/uploads',\n respectForwardedHeaders: pluginOptions.s3.respectForwardedHeaders ?? false,\n })\n}\n\n/**\n * Creates TUS upload endpoints for file handling\n * @param tusServer - The TUS server instance\n * @returns An array of endpoint configurations\n */\nfunction createTusEndpoints(tusServer: TusServer) {\n /**\n * Handles TUS requests through the server\n * @param req - The payload request object\n * @returns The server response\n */\n function tusHandler(req: PayloadRequest) {\n return tusServer.handleWeb(req as Request)\n }\n\n return [\n { handler: tusHandler, method: 'options' as const, path: '/uploads' },\n { handler: tusHandler, method: 'post' as const, path: '/uploads' },\n { handler: tusHandler, method: 'get' as const, path: '/uploads/:id' },\n { handler: tusHandler, method: 'put' as const, path: '/uploads/:id' },\n { handler: tusHandler, method: 'patch' as const, path: '/uploads/:id' },\n { handler: tusHandler, method: 'delete' as const, path: '/uploads/:id' },\n ]\n}\n\n/**\n * Creates Mux-related endpoints for asset handling\n * @param args - The arguments for creating Mux endpoints\n * @returns An array of Mux endpoint configurations\n */\nfunction createMuxEndpoints(args: CreateMuxEndpointsArgs) {\n const { getMuxClient, pluginOptions } = args\n return [\n {\n handler: getMuxWebhookHandler({ getMuxClient }),\n method: 'get' as const,\n path: '/mux/webhook',\n },\n {\n handler: getMuxCreateUploadHandler({ getMuxClient, pluginOptions }),\n method: 'post' as const,\n path: '/mux/upload',\n },\n {\n handler: getMuxAssetHandler({ getMuxClient }),\n method: 'get' as const,\n path: '/mux/asset',\n },\n ]\n}\n\n/**\n * Media Cloud Plugin for Payload CMS\n * Provides file upload capabilities using S3 storage and Mux video processing\n * @param pluginOptions - Configuration options for the plugin\n * @returns A function that configures the Payload config\n */\nexport function mediaCloudPlugin(pluginOptions: MediaCloudPluginOptions) {\n return function (config: Config): Config {\n if (!pluginOptions) {\n logError(MediaCloudError.PLUGIN_NOT_CONFIGURED)\n return config\n }\n\n const isPluginDisabled = pluginOptions.enabled === false\n\n /**\n * Gets or creates a Mux client instance\n * @returns The Mux client instance\n */\n function getMuxClient(): Mux {\n // Return existing Mux client if already created\n if (muxClient) {\n return muxClient\n }\n // Create and return a new Mux client\n return createMuxClient(pluginOptions.mux)\n }\n\n // Validate Mux configuration\n if (pluginOptions.mux) {\n validateMuxConfig(pluginOptions.mux)\n muxClient = getMuxClient()\n } else {\n logError(MediaCloudError.MUX_CONFIG_INCOMPLETE)\n muxClient = null\n }\n\n const s3Store = createS3Store(pluginOptions.s3)\n const tusServer = createTusServer({ config, s3Store, pluginOptions })\n const mediaCollection = getMediaCollection({ s3Store })\n\n if (isPluginDisabled) {\n return config\n }\n\n // Initialize client uploads\n initClientUploads({\n clientHandler:\n '@maas/payload-plugin-media-cloud/components#UploadHandler',\n collections: {\n media: {\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n config,\n enabled: true,\n serverHandler: () => {\n return Response.json(\n { message: 'Server handler is not implemented' },\n { status: 501 }\n )\n },\n serverHandlerPath: '/media-cloud/upload',\n })\n\n const cloudStorageConfig = {\n collections: {\n media: {\n adapter: getStorageAdapter({ getMuxClient, pluginOptions, s3Store }),\n clientUploads: true,\n disableLocalStorage: true,\n },\n },\n }\n\n const mappedConfig: Config = {\n ...config,\n admin: {\n ...(config.admin ?? {}),\n components: {\n ...(config.admin?.components ?? {}),\n providers: [\n '@maas/payload-plugin-media-cloud/components#UploadManagerProvider',\n ...(config.admin?.components?.providers ?? []),\n ],\n },\n },\n collections: [...(config.collections ?? []), mediaCollection],\n endpoints: [\n ...(config.endpoints ?? []),\n ...createTusEndpoints(tusServer),\n ...createMuxEndpoints({ getMuxClient, pluginOptions }),\n ],\n }\n\n return cloudStoragePlugin(cloudStorageConfig)(mappedConfig)\n }\n}\n"],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -8,18 +8,19 @@ interface MediaCloudPluginOptions {
|
|
|
8
8
|
enabled?: boolean;
|
|
9
9
|
mux: {
|
|
10
10
|
assetOptions: Partial<Mux.Video.Assets.AssetOptions>;
|
|
11
|
-
testMode?: boolean;
|
|
12
11
|
tokenId: string;
|
|
13
12
|
tokenSecret: string;
|
|
14
13
|
webhookSecret: string;
|
|
14
|
+
testMode?: boolean;
|
|
15
15
|
};
|
|
16
16
|
s3: {
|
|
17
17
|
accessKeyId: string;
|
|
18
|
-
acl?: string;
|
|
19
18
|
bucket: string;
|
|
20
|
-
endpoint?: string;
|
|
21
19
|
region: string;
|
|
22
20
|
secretAccessKey: string;
|
|
21
|
+
acl?: string;
|
|
22
|
+
endpoint?: string;
|
|
23
|
+
respectForwardedHeaders?: boolean;
|
|
23
24
|
};
|
|
24
25
|
}
|
|
25
26
|
interface S3StoreConfig {
|