@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.
Files changed (54) hide show
  1. package/dist/adapter/handleDelete.mjs +31 -24
  2. package/dist/adapter/handleDelete.mjs.map +1 -1
  3. package/dist/adapter/handleUpload.mjs +1 -1
  4. package/dist/adapter/handleUpload.mjs.map +1 -1
  5. package/dist/collections/mediaCollection.d.mts +1 -0
  6. package/dist/collections/mediaCollection.mjs +8 -2
  7. package/dist/collections/mediaCollection.mjs.map +1 -1
  8. package/dist/components/upload-handler/upload-handler.mjs +31 -33
  9. package/dist/components/upload-handler/upload-handler.mjs.map +1 -1
  10. package/dist/components/upload-manager/upload-manager.d.mts +4 -14
  11. package/dist/components/upload-manager/upload-manager.mjs +35 -36
  12. package/dist/components/upload-manager/upload-manager.mjs.map +1 -1
  13. package/dist/endpoints/muxAssetHandler.mjs +13 -9
  14. package/dist/endpoints/muxAssetHandler.mjs.map +1 -1
  15. package/dist/endpoints/muxCreateUploadHandler.mjs +1 -1
  16. package/dist/endpoints/muxCreateUploadHandler.mjs.map +1 -1
  17. package/dist/endpoints/muxWebhookHandler.mjs +46 -20
  18. package/dist/endpoints/muxWebhookHandler.mjs.map +1 -1
  19. package/dist/endpoints/tusPostProcessorHandler.mjs +7 -9
  20. package/dist/endpoints/tusPostProcessorHandler.mjs.map +1 -1
  21. package/dist/error-handler/dist/index.mjs +84 -64
  22. package/dist/error-handler/dist/index.mjs.map +1 -1
  23. package/dist/hooks/useErrorHandler.d.mts +2 -172
  24. package/dist/hooks/useErrorHandler.mjs +4 -9
  25. package/dist/hooks/useErrorHandler.mjs.map +1 -1
  26. package/dist/hooks/useMediaCloudEmitter.d.mts +26 -0
  27. package/dist/hooks/{useEmitter.mjs → useMediaCloudEmitter.mjs} +4 -4
  28. package/dist/hooks/useMediaCloudEmitter.mjs.map +1 -0
  29. package/dist/index.d.mts +2 -2
  30. package/dist/plugin.d.mts +2 -3
  31. package/dist/plugin.mjs +25 -172
  32. package/dist/plugin.mjs.map +1 -1
  33. package/dist/tus/stores/s3/index.d.mts +15 -0
  34. package/dist/tus/stores/s3/index.mjs +30 -0
  35. package/dist/tus/stores/s3/index.mjs.map +1 -0
  36. package/dist/tus/stores/s3/parts-manager.mjs +1 -1
  37. package/dist/tus/stores/s3/parts-manager.mjs.map +1 -1
  38. package/dist/tus/stores/s3/s3-store.mjs +1 -1
  39. package/dist/tus/stores/s3/s3-store.mjs.map +1 -1
  40. package/dist/types/errors.d.mts +24 -44
  41. package/dist/types/errors.mjs +25 -16
  42. package/dist/types/errors.mjs.map +1 -1
  43. package/dist/types/index.d.mts +30 -2
  44. package/dist/utils/file.mjs +2 -2
  45. package/dist/utils/file.mjs.map +1 -1
  46. package/dist/utils/mux.d.mts +39 -0
  47. package/dist/utils/mux.mjs +56 -0
  48. package/dist/utils/mux.mjs.map +1 -0
  49. package/dist/utils/tus.d.mts +56 -0
  50. package/dist/utils/tus.mjs +85 -0
  51. package/dist/utils/tus.mjs.map +1 -0
  52. package/package.json +20 -15
  53. package/dist/hooks/useEmitter.d.mts +0 -47
  54. 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.10",
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.940.0",
34
- "@mux/mux-node": "^12.8.0",
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.49",
48
- "@payloadcms/ui": "^3.49",
49
- "payload": "^3.49",
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.1",
63
- "@payloadcms/plugin-cloud-storage": "3.49.1",
64
- "@payloadcms/ui": "3.49.1",
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": "^19.2.7",
68
- "@types/react-dom": "^19.2.3",
72
+ "@types/react": "19.2.1",
73
+ "@types/react-dom": "19.2.1",
69
74
  "glob": "^13.0.0",
70
- "payload": "3.49.1",
71
- "react": "19.1.0",
72
- "react-dom": "19.1.0",
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.8.3",
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"}