@maas/payload-plugin-media-cloud 0.0.10 → 0.0.14
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/adapter/handleDelete.mjs +31 -24
- package/dist/adapter/handleDelete.mjs.map +1 -1
- package/dist/adapter/handleUpload.mjs +1 -1
- package/dist/adapter/handleUpload.mjs.map +1 -1
- package/dist/collections/mediaCollection.d.mts +1 -0
- package/dist/collections/mediaCollection.mjs +8 -2
- package/dist/collections/mediaCollection.mjs.map +1 -1
- package/dist/components/upload-handler/upload-handler.mjs +31 -33
- package/dist/components/upload-handler/upload-handler.mjs.map +1 -1
- package/dist/components/upload-manager/upload-manager.d.mts +4 -14
- package/dist/components/upload-manager/upload-manager.mjs +35 -36
- package/dist/components/upload-manager/upload-manager.mjs.map +1 -1
- package/dist/endpoints/muxAssetHandler.mjs +13 -9
- package/dist/endpoints/muxAssetHandler.mjs.map +1 -1
- package/dist/endpoints/muxCreateUploadHandler.mjs +1 -1
- package/dist/endpoints/muxCreateUploadHandler.mjs.map +1 -1
- package/dist/endpoints/muxWebhookHandler.mjs +46 -20
- package/dist/endpoints/muxWebhookHandler.mjs.map +1 -1
- package/dist/endpoints/tusPostProcessorHandler.mjs +7 -9
- package/dist/endpoints/tusPostProcessorHandler.mjs.map +1 -1
- package/dist/error-handler/dist/index.mjs +84 -64
- package/dist/error-handler/dist/index.mjs.map +1 -1
- package/dist/hooks/useErrorHandler.d.mts +2 -172
- package/dist/hooks/useErrorHandler.mjs +4 -9
- package/dist/hooks/useErrorHandler.mjs.map +1 -1
- package/dist/hooks/useMediaCloudEmitter.d.mts +26 -0
- package/dist/hooks/{useEmitter.mjs → useMediaCloudEmitter.mjs} +4 -4
- package/dist/hooks/useMediaCloudEmitter.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/plugin.d.mts +2 -3
- package/dist/plugin.mjs +25 -172
- package/dist/plugin.mjs.map +1 -1
- package/dist/tus/stores/s3/index.d.mts +15 -0
- package/dist/tus/stores/s3/index.mjs +30 -0
- package/dist/tus/stores/s3/index.mjs.map +1 -0
- package/dist/tus/stores/s3/parts-manager.mjs +1 -1
- package/dist/tus/stores/s3/parts-manager.mjs.map +1 -1
- package/dist/tus/stores/s3/s3-store.mjs +1 -1
- package/dist/tus/stores/s3/s3-store.mjs.map +1 -1
- package/dist/types/errors.d.mts +24 -44
- package/dist/types/errors.mjs +25 -16
- package/dist/types/errors.mjs.map +1 -1
- package/dist/types/index.d.mts +30 -2
- package/dist/utils/file.mjs +2 -2
- package/dist/utils/file.mjs.map +1 -1
- package/dist/utils/mux.d.mts +39 -0
- package/dist/utils/mux.mjs +56 -0
- package/dist/utils/mux.mjs.map +1 -0
- package/dist/utils/tus.d.mts +56 -0
- package/dist/utils/tus.mjs +85 -0
- package/dist/utils/tus.mjs.map +1 -0
- package/package.json +20 -15
- package/dist/hooks/useEmitter.d.mts +0 -47
- package/dist/hooks/useEmitter.mjs.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { MediaCloudPluginOptions } from "../types/index.mjs";
|
|
2
|
+
import { S3Store } from "../tus/stores/s3/s3-store.mjs";
|
|
3
|
+
import * as payload0 from "payload";
|
|
4
|
+
import { Config, PayloadRequest } from "payload";
|
|
5
|
+
import { DataStore, Server } from "@tus/server";
|
|
6
|
+
|
|
7
|
+
//#region src/utils/tus.d.ts
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a TUS server instance with S3 storage
|
|
11
|
+
* @param args - The arguments for creating the TUS server
|
|
12
|
+
* @returns A configured TusServer instance
|
|
13
|
+
*/
|
|
14
|
+
interface CreateTusServerArgs {
|
|
15
|
+
config: Config;
|
|
16
|
+
s3Store: DataStore;
|
|
17
|
+
pluginOptions: MediaCloudPluginOptions;
|
|
18
|
+
}
|
|
19
|
+
declare function createTusServer(args: CreateTusServerArgs): Server;
|
|
20
|
+
/**
|
|
21
|
+
* Creates TUS upload endpoints for file handling
|
|
22
|
+
* @param tusServer - The TUS server instance
|
|
23
|
+
* @returns An array of endpoint configurations
|
|
24
|
+
*/
|
|
25
|
+
interface CreateTusEndpointsArgs {
|
|
26
|
+
tusServer: Server;
|
|
27
|
+
s3Store: S3Store;
|
|
28
|
+
}
|
|
29
|
+
declare function createTusEndpoints(args: CreateTusEndpointsArgs): ({
|
|
30
|
+
handler: (req: PayloadRequest) => Promise<Response>;
|
|
31
|
+
method: "options";
|
|
32
|
+
path: string;
|
|
33
|
+
} | {
|
|
34
|
+
handler: (req: PayloadRequest) => Promise<Response>;
|
|
35
|
+
method: "post";
|
|
36
|
+
path: string;
|
|
37
|
+
} | {
|
|
38
|
+
handler: (req: PayloadRequest) => Promise<Response>;
|
|
39
|
+
method: "put";
|
|
40
|
+
path: string;
|
|
41
|
+
} | {
|
|
42
|
+
handler: (req: PayloadRequest) => Promise<Response>;
|
|
43
|
+
method: "patch";
|
|
44
|
+
path: string;
|
|
45
|
+
} | {
|
|
46
|
+
handler: (req: PayloadRequest) => Promise<Response>;
|
|
47
|
+
method: "delete";
|
|
48
|
+
path: string;
|
|
49
|
+
} | {
|
|
50
|
+
handler: payload0.PayloadHandler;
|
|
51
|
+
method: "get";
|
|
52
|
+
path: string;
|
|
53
|
+
})[];
|
|
54
|
+
//#endregion
|
|
55
|
+
export { createTusEndpoints, createTusServer };
|
|
56
|
+
//# sourceMappingURL=tus.d.mts.map
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { MediaCloudErrors } from "../types/errors.mjs";
|
|
2
|
+
import { useErrorHandler } from "../hooks/useErrorHandler.mjs";
|
|
3
|
+
import { generateUniqueFilename } from "./file.mjs";
|
|
4
|
+
import { getTusPostProcessorHandler } from "../endpoints/tusPostProcessorHandler.mjs";
|
|
5
|
+
import { getPayload, sanitizeConfig } from "payload";
|
|
6
|
+
import { Server } from "@tus/server";
|
|
7
|
+
|
|
8
|
+
//#region src/utils/tus.ts
|
|
9
|
+
const { logError } = useErrorHandler();
|
|
10
|
+
function createTusServer(args) {
|
|
11
|
+
const { config, s3Store, pluginOptions } = args;
|
|
12
|
+
return new Server({
|
|
13
|
+
datastore: s3Store,
|
|
14
|
+
namingFunction: async (req, metadata) => {
|
|
15
|
+
try {
|
|
16
|
+
const { docs } = await (await getPayload({ config: sanitizeConfig(config) })).find({
|
|
17
|
+
collection: "media",
|
|
18
|
+
where: { filename: { equals: metadata?.filename || "" } }
|
|
19
|
+
});
|
|
20
|
+
switch (true) {
|
|
21
|
+
case docs.length > 0: return generateUniqueFilename(metadata?.filename ?? "");
|
|
22
|
+
case !!metadata?.filename: return metadata.filename;
|
|
23
|
+
default: return generateUniqueFilename("");
|
|
24
|
+
}
|
|
25
|
+
} catch (_error) {
|
|
26
|
+
logError(MediaCloudErrors.NAMING_FUNCTION_ERROR.message);
|
|
27
|
+
return metadata?.filename ?? generateUniqueFilename("");
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
path: "/api/uploads",
|
|
31
|
+
respectForwardedHeaders: pluginOptions.s3.respectForwardedHeaders ?? true
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function createTusEndpoints(args) {
|
|
35
|
+
const { tusServer, s3Store } = args;
|
|
36
|
+
/**
|
|
37
|
+
* Handles TUS requests through the server
|
|
38
|
+
* @param req - The payload request object
|
|
39
|
+
* @returns The server response
|
|
40
|
+
*/
|
|
41
|
+
function tusHandler(req) {
|
|
42
|
+
return tusServer.handleWeb(req);
|
|
43
|
+
}
|
|
44
|
+
return [
|
|
45
|
+
{
|
|
46
|
+
handler: tusHandler,
|
|
47
|
+
method: "options",
|
|
48
|
+
path: "/uploads"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
handler: tusHandler,
|
|
52
|
+
method: "post",
|
|
53
|
+
path: "/uploads"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
handler: tusHandler,
|
|
57
|
+
method: "get",
|
|
58
|
+
path: "/uploads/:id"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
handler: tusHandler,
|
|
62
|
+
method: "put",
|
|
63
|
+
path: "/uploads/:id"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
handler: tusHandler,
|
|
67
|
+
method: "patch",
|
|
68
|
+
path: "/uploads/:id"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
handler: tusHandler,
|
|
72
|
+
method: "delete",
|
|
73
|
+
path: "/uploads/:id"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
handler: getTusPostProcessorHandler({ s3Store }),
|
|
77
|
+
method: "get",
|
|
78
|
+
path: "/uploads/:filename/process"
|
|
79
|
+
}
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
//#endregion
|
|
84
|
+
export { createTusEndpoints, createTusServer };
|
|
85
|
+
//# sourceMappingURL=tus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tus.mjs","names":["TusServer"],"sources":["../../src/utils/tus.ts"],"sourcesContent":["import { getPayload, sanitizeConfig } from 'payload'\nimport { Server as TusServer, type DataStore } from '@tus/server'\n\nimport { MediaCloudErrors } from '../types/errors'\nimport { generateUniqueFilename } from '../utils/file'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\n\nimport { getTusPostProcessorHandler } from '../endpoints/tusPostProcessorHandler'\nimport { S3Store } from '../tus/stores/s3/s3-store'\n\nimport type { Config, PayloadRequest } from 'payload'\nimport type { MediaCloudPluginOptions } from '../types'\n\nconst { logError } = useErrorHandler()\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 */\ninterface CreateTusServerArgs {\n config: Config\n s3Store: DataStore\n pluginOptions: MediaCloudPluginOptions\n}\n\nexport function 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 switch (true) {\n case docs.length > 0:\n return generateUniqueFilename(metadata?.filename ?? '')\n case !!metadata?.filename:\n return metadata.filename\n default:\n return generateUniqueFilename('')\n }\n } catch (_error) {\n logError(MediaCloudErrors.NAMING_FUNCTION_ERROR.message)\n return metadata?.filename ?? generateUniqueFilename('')\n }\n },\n path: '/api/uploads',\n respectForwardedHeaders: pluginOptions.s3.respectForwardedHeaders ?? true,\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 */\ninterface CreateTusEndpointsArgs {\n tusServer: TusServer\n s3Store: S3Store\n}\n\nexport function createTusEndpoints(args: CreateTusEndpointsArgs) {\n const { tusServer, s3Store } = args\n\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 handler: getTusPostProcessorHandler({ s3Store }),\n method: 'get' as const,\n path: '/uploads/:filename/process',\n },\n ]\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,EAAE,aAAa,iBAAiB;AAatC,SAAgB,gBAAgB,MAAsC;CACpE,MAAM,EAAE,QAAQ,SAAS,kBAAkB;AAE3C,QAAO,IAAIA,OAAU;EACnB,WAAW;EACX,gBAAgB,OAAO,KAAK,aAAa;AACvC,OAAI;IAOF,MAAM,EAAE,SAAS,OALD,MAAM,WAAW,EAC/B,QAAQ,eAAe,OAAO,EAC/B,CAAC,EAG6B,KAAK;KAClC,YAAY;KACZ,OAAO,EACL,UAAU,EACR,QAAQ,UAAU,YAAY,IAC/B,EACF;KACF,CAAC;AAEF,YAAQ,MAAR;KACE,KAAK,KAAK,SAAS,EACjB,QAAO,uBAAuB,UAAU,YAAY,GAAG;KACzD,KAAK,CAAC,CAAC,UAAU,SACf,QAAO,SAAS;KAClB,QACE,QAAO,uBAAuB,GAAG;;YAE9B,QAAQ;AACf,aAAS,iBAAiB,sBAAsB,QAAQ;AACxD,WAAO,UAAU,YAAY,uBAAuB,GAAG;;;EAG3D,MAAM;EACN,yBAAyB,cAAc,GAAG,2BAA2B;EACtE,CAAC;;AAaJ,SAAgB,mBAAmB,MAA8B;CAC/D,MAAM,EAAE,WAAW,YAAY;;;;;;CAO/B,SAAS,WAAW,KAAqB;AACvC,SAAO,UAAU,UAAU,IAAe;;AAG5C,QAAO;EACL;GAAE,SAAS;GAAY,QAAQ;GAAoB,MAAM;GAAY;EACrE;GAAE,SAAS;GAAY,QAAQ;GAAiB,MAAM;GAAY;EAClE;GAAE,SAAS;GAAY,QAAQ;GAAgB,MAAM;GAAgB;EACrE;GAAE,SAAS;GAAY,QAAQ;GAAgB,MAAM;GAAgB;EACrE;GAAE,SAAS;GAAY,QAAQ;GAAkB,MAAM;GAAgB;EACvE;GAAE,SAAS;GAAY,QAAQ;GAAmB,MAAM;GAAgB;EACxE;GACE,SAAS,2BAA2B,EAAE,SAAS,CAAC;GAChD,QAAQ;GACR,MAAM;GACP;EACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maas/payload-plugin-media-cloud",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"contributors": [
|
|
6
6
|
{
|
|
@@ -26,12 +26,17 @@
|
|
|
26
26
|
"./components": {
|
|
27
27
|
"types": "./dist/components/index.d.mts",
|
|
28
28
|
"import": "./dist/components/index.mjs"
|
|
29
|
+
},
|
|
30
|
+
"./useMediaCloudEmitter": {
|
|
31
|
+
"types": "./dist/hooks/useMediaCloudEmitter.d.mts",
|
|
32
|
+
"import": "./dist/hooks/useMediaCloudEmitter.mjs"
|
|
29
33
|
}
|
|
30
34
|
},
|
|
31
35
|
"sideEffects": false,
|
|
32
36
|
"dependencies": {
|
|
33
|
-
"@aws-sdk/client-s3": "^3.
|
|
34
|
-
"@
|
|
37
|
+
"@aws-sdk/client-s3": "^3.943.0",
|
|
38
|
+
"@fastify/deepmerge": "3.1.0",
|
|
39
|
+
"@mux/mux-node": "^12.8.1",
|
|
35
40
|
"@mux/upchunk": "^3.5.0",
|
|
36
41
|
"@tus/server": "^2.3.0",
|
|
37
42
|
"@tus/utils": "^0.6.0",
|
|
@@ -44,9 +49,9 @@
|
|
|
44
49
|
},
|
|
45
50
|
"peerDependencies": {
|
|
46
51
|
"@mux/mux-player-react": "^3",
|
|
47
|
-
"@payloadcms/plugin-cloud-storage": "^3.
|
|
48
|
-
"@payloadcms/ui": "^3.
|
|
49
|
-
"payload": "^3.
|
|
52
|
+
"@payloadcms/plugin-cloud-storage": "^3.61",
|
|
53
|
+
"@payloadcms/ui": "^3.61",
|
|
54
|
+
"payload": "^3.61",
|
|
50
55
|
"react": "^19.1",
|
|
51
56
|
"react-dom": "^19.1"
|
|
52
57
|
},
|
|
@@ -59,19 +64,19 @@
|
|
|
59
64
|
}
|
|
60
65
|
},
|
|
61
66
|
"devDependencies": {
|
|
62
|
-
"@mux/mux-player-react": "^3.9.
|
|
63
|
-
"@payloadcms/plugin-cloud-storage": "3.
|
|
64
|
-
"@payloadcms/ui": "3.
|
|
67
|
+
"@mux/mux-player-react": "^3.9.2",
|
|
68
|
+
"@payloadcms/plugin-cloud-storage": "3.66.0",
|
|
69
|
+
"@payloadcms/ui": "3.66.0",
|
|
65
70
|
"@types/multistream": "^4.1.3",
|
|
66
71
|
"@types/node": "^22.19.1",
|
|
67
|
-
"@types/react": "
|
|
68
|
-
"@types/react-dom": "
|
|
72
|
+
"@types/react": "19.2.1",
|
|
73
|
+
"@types/react-dom": "19.2.1",
|
|
69
74
|
"glob": "^13.0.0",
|
|
70
|
-
"payload": "3.
|
|
71
|
-
"react": "19.1
|
|
72
|
-
"react-dom": "19.1
|
|
75
|
+
"payload": "3.66.0",
|
|
76
|
+
"react": "19.2.1",
|
|
77
|
+
"react-dom": "19.2.1",
|
|
73
78
|
"tsdown": "^0.16.8",
|
|
74
|
-
"typescript": "5.
|
|
79
|
+
"typescript": "5.7.3",
|
|
75
80
|
"@maas/error-handler": "1.0.0"
|
|
76
81
|
},
|
|
77
82
|
"scripts": {
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import * as mitt0 from "mitt";
|
|
2
|
-
|
|
3
|
-
//#region src/hooks/useEmitter.d.ts
|
|
4
|
-
type EmitterEvents = {
|
|
5
|
-
'add-upload': {
|
|
6
|
-
id: string;
|
|
7
|
-
filename: string;
|
|
8
|
-
polling?: boolean;
|
|
9
|
-
pollingUrl?: string;
|
|
10
|
-
};
|
|
11
|
-
'update-upload': {
|
|
12
|
-
id: string;
|
|
13
|
-
progress: number;
|
|
14
|
-
};
|
|
15
|
-
'remove-upload': {
|
|
16
|
-
id: string;
|
|
17
|
-
};
|
|
18
|
-
'upload-completed': {
|
|
19
|
-
id: string;
|
|
20
|
-
};
|
|
21
|
-
'upload-errored': {
|
|
22
|
-
id: string;
|
|
23
|
-
error: string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
declare const emitter: mitt0.Emitter<EmitterEvents>;
|
|
27
|
-
/**
|
|
28
|
-
* Hook to access the global event emitter for upload management
|
|
29
|
-
* @returns An object with emitter methods (on, off, emit)
|
|
30
|
-
*/
|
|
31
|
-
declare function useEmitter(): {
|
|
32
|
-
on: {
|
|
33
|
-
<Key extends keyof EmitterEvents>(type: Key, handler: mitt0.Handler<EmitterEvents[Key]>): void;
|
|
34
|
-
(type: "*", handler: mitt0.WildcardHandler<EmitterEvents>): void;
|
|
35
|
-
};
|
|
36
|
-
off: {
|
|
37
|
-
<Key extends keyof EmitterEvents>(type: Key, handler?: mitt0.Handler<EmitterEvents[Key]> | undefined): void;
|
|
38
|
-
(type: "*", handler: mitt0.WildcardHandler<EmitterEvents>): void;
|
|
39
|
-
};
|
|
40
|
-
emit: {
|
|
41
|
-
<Key extends keyof EmitterEvents>(type: Key, event: EmitterEvents[Key]): void;
|
|
42
|
-
<Key extends keyof EmitterEvents>(type: undefined extends EmitterEvents[Key] ? Key : never): void;
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
//#endregion
|
|
46
|
-
export { emitter, useEmitter };
|
|
47
|
-
//# sourceMappingURL=useEmitter.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|