@wlindabla/file_uploader 1.0.0 → 2.0.1

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 (110) hide show
  1. package/README.md +54 -28
  2. package/dist/cjs/cache/index.d.ts +198 -0
  3. package/dist/cjs/cache/index.js +318 -0
  4. package/dist/cjs/cache/index.js.map +1 -0
  5. package/dist/cjs/core/index.d.ts +271 -0
  6. package/dist/cjs/core/index.js +762 -0
  7. package/dist/cjs/core/index.js.map +1 -0
  8. package/dist/cjs/events/chunk/index.d.ts +27 -0
  9. package/dist/cjs/events/chunk/index.js +70 -0
  10. package/dist/cjs/events/chunk/index.js.map +1 -0
  11. package/dist/cjs/events/complete/index.d.ts +64 -0
  12. package/dist/cjs/events/complete/index.js +152 -0
  13. package/dist/cjs/events/complete/index.js.map +1 -0
  14. package/dist/cjs/events/index.d.ts +95 -0
  15. package/dist/cjs/events/index.js +85 -0
  16. package/dist/cjs/events/index.js.map +1 -0
  17. package/dist/cjs/events/initialize/index.d.ts +45 -0
  18. package/dist/cjs/events/initialize/index.js +105 -0
  19. package/dist/cjs/events/initialize/index.js.map +1 -0
  20. package/dist/cjs/events/state/index.d.ts +67 -0
  21. package/dist/cjs/events/state/index.js +145 -0
  22. package/dist/cjs/events/state/index.js.map +1 -0
  23. package/dist/cjs/exceptions/index.d.ts +84 -0
  24. package/dist/{exceptions → cjs/exceptions}/index.js +38 -18
  25. package/dist/cjs/exceptions/index.js.map +1 -0
  26. package/dist/cjs/index.d.ts +14 -0
  27. package/dist/cjs/index.js +33 -0
  28. package/dist/cjs/index.js.map +1 -0
  29. package/dist/cjs/subscribers/index.d.ts +34 -0
  30. package/dist/cjs/subscribers/index.js +187 -0
  31. package/dist/cjs/subscribers/index.js.map +1 -0
  32. package/dist/cjs/types/index.d.ts +110 -0
  33. package/dist/cjs/types/index.js +53 -0
  34. package/dist/cjs/types/index.js.map +1 -0
  35. package/dist/cjs/utils/index.d.ts +72 -0
  36. package/dist/cjs/utils/index.js +208 -0
  37. package/dist/cjs/utils/index.js.map +1 -0
  38. package/dist/esm/cache/index.d.mts +198 -0
  39. package/dist/esm/cache/index.js +4 -0
  40. package/dist/{index.js.map → esm/cache/index.js.map} +1 -1
  41. package/dist/{events/initialize/index.js → esm/chunk-3JTTZCSQ.js} +25 -19
  42. package/dist/esm/chunk-3JTTZCSQ.js.map +1 -0
  43. package/dist/{events/state/index.js → esm/chunk-6225YMFE.js} +38 -20
  44. package/dist/esm/chunk-6225YMFE.js.map +1 -0
  45. package/dist/esm/chunk-7QVYU63E.js +6 -0
  46. package/dist/esm/chunk-7QVYU63E.js.map +1 -0
  47. package/dist/{events/complete/index.js → esm/chunk-BNMI7DW3.js} +25 -19
  48. package/dist/esm/chunk-BNMI7DW3.js.map +1 -0
  49. package/dist/{subscribers/index.js → esm/chunk-HYNJBWW5.js} +36 -34
  50. package/dist/esm/chunk-HYNJBWW5.js.map +1 -0
  51. package/dist/{events/index.js → esm/chunk-JDL3U4OX.js} +7 -37
  52. package/dist/esm/chunk-JDL3U4OX.js.map +1 -0
  53. package/dist/{events/chunk/index.js → esm/chunk-LD2DWZRJ.js} +14 -11
  54. package/dist/esm/chunk-LD2DWZRJ.js.map +1 -0
  55. package/dist/{utils/index.js → esm/chunk-MFYC4PBP.js} +15 -22
  56. package/dist/esm/chunk-MFYC4PBP.js.map +1 -0
  57. package/dist/esm/chunk-NXYS73I4.js +125 -0
  58. package/dist/esm/chunk-NXYS73I4.js.map +1 -0
  59. package/dist/{cache/index.js → esm/chunk-PFALORWQ.js} +10 -11
  60. package/dist/esm/chunk-PFALORWQ.js.map +1 -0
  61. package/dist/{core/index.js → esm/chunk-TONVXBLH.js} +239 -231
  62. package/dist/esm/chunk-TONVXBLH.js.map +1 -0
  63. package/dist/{types/index.js → esm/chunk-X757PBC5.js} +5 -7
  64. package/dist/esm/chunk-X757PBC5.js.map +1 -0
  65. package/dist/esm/core/index.d.mts +271 -0
  66. package/dist/esm/core/index.js +12 -0
  67. package/dist/esm/core/index.js.map +1 -0
  68. package/dist/esm/events/chunk/index.d.mts +27 -0
  69. package/dist/esm/events/chunk/index.js +4 -0
  70. package/dist/esm/events/chunk/index.js.map +1 -0
  71. package/dist/esm/events/complete/index.d.mts +64 -0
  72. package/dist/esm/events/complete/index.js +4 -0
  73. package/dist/esm/events/complete/index.js.map +1 -0
  74. package/dist/esm/events/index.d.mts +95 -0
  75. package/dist/esm/events/index.js +8 -0
  76. package/dist/esm/events/index.js.map +1 -0
  77. package/dist/esm/events/initialize/index.d.mts +45 -0
  78. package/dist/esm/events/initialize/index.js +4 -0
  79. package/dist/esm/events/initialize/index.js.map +1 -0
  80. package/dist/esm/events/state/index.d.mts +67 -0
  81. package/dist/esm/events/state/index.js +4 -0
  82. package/dist/esm/events/state/index.js.map +1 -0
  83. package/dist/esm/exceptions/index.d.mts +84 -0
  84. package/dist/esm/exceptions/index.js +4 -0
  85. package/dist/esm/exceptions/index.js.map +1 -0
  86. package/dist/esm/index.d.mts +14 -0
  87. package/dist/esm/index.js +14 -0
  88. package/dist/esm/index.js.map +1 -0
  89. package/dist/esm/subscribers/index.d.mts +34 -0
  90. package/dist/esm/subscribers/index.js +10 -0
  91. package/dist/esm/subscribers/index.js.map +1 -0
  92. package/dist/esm/types/index.d.mts +110 -0
  93. package/dist/esm/types/index.js +4 -0
  94. package/dist/esm/types/index.js.map +1 -0
  95. package/dist/esm/utils/index.d.mts +72 -0
  96. package/dist/esm/utils/index.js +5 -0
  97. package/dist/esm/utils/index.js.map +1 -0
  98. package/package.json +165 -14
  99. package/dist/cache/index.js.map +0 -1
  100. package/dist/core/index.js.map +0 -1
  101. package/dist/events/chunk/index.js.map +0 -1
  102. package/dist/events/complete/index.js.map +0 -1
  103. package/dist/events/index.js.map +0 -1
  104. package/dist/events/initialize/index.js.map +0 -1
  105. package/dist/events/state/index.js.map +0 -1
  106. package/dist/exceptions/index.js.map +0 -1
  107. package/dist/index.js +0 -49
  108. package/dist/subscribers/index.js.map +0 -1
  109. package/dist/types/index.js.map +0 -1
  110. package/dist/utils/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/index.ts"],"names":[],"mappings":"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","file":"chunk-TONVXBLH.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\n\nimport {\n EventDispatcherInterface\n} from \"@wlindabla/event_dispatcher\";\n\nimport {\n FetchResponseInterface\n} from \"@wlindabla/http_client/contracts\";\n\nimport {\n safeFetch,\n HttpFetchError\n} from \"@wlindabla/http_client/core\";\n\nimport {\n ChunkError,\n ChunkInfo,\n ResumeData,\n UploadEndpoints,\n UploadOptions,\n UploadProgress,\n UploadResult,\n UploadState\n} from \"../types\";\n\nimport { UploadResumeCacheInterface } from \"../cache\";\nimport {\n FileUtils,\n createChunkFormData\n} from \"../utils\";\n\nimport {\n ChunkUploadHttpErrorResponseEvent,\n HttpFileUploaderEvents,\n InitializingUploadEvent,\n UploadCancelledEvent,\n UploadProgressEvent,\n UploadStateChangedEvent,\n UploadChunkStartedEvent,\n UploadPausedEvent,\n UploadResumedEvent,\n ResumeUploadEvent,\n FinalizeUploadEvent,\n UploadMediaCompleteEvent\n} from \"../events\";\n\nimport { ChunkUploadHttpErrorException, FileUploadChunkError } from \"../exceptions\";\n\nimport pLimit from 'p-limit';\n\n\n/**\n * ChunkedFileUploader\n *\n * A production-ready, event-driven chunked file upload engine for Browser and Node.js.\n *\n * Designed and developed by **AGBOKOUDJO Franck** at\n * **INTERNATIONALES WEB APPS & SERVICES**, this class provides a robust,\n * framework-agnostic solution for uploading large files to a remote server\n * by splitting them into smaller chunks and sending them in parallel with\n * configurable concurrency control.\n *\n * ---\n *\n * ### How It Works\n *\n * The upload process follows a strict three-phase lifecycle:\n *\n * 1. **Initialization** — A session is opened with the server via the `init` endpoint.\n * The file is identified by its name, size, type, and a SHA-256 hash of its\n * first megabyte. The server returns a unique `mediaId` that identifies the session.\n *\n * 2. **Chunk Upload** — The file is sliced into fixed-size chunks and uploaded\n * concurrently using `p-limit`. Each chunk carries its index, the total number\n * of chunks, and the session `mediaId`. Failed chunks are retried automatically\n * with exponential backoff up to `maxRetries` attempts.\n *\n * 3. **Finalization** — Once all chunks are successfully uploaded, the `finalize`\n * endpoint is called to instruct the server to assemble the chunks into the\n * final file.\n *\n * ---\n *\n * ### Event-Driven Architecture\n *\n * This class follows the **Symfony EventDispatcher pattern** via\n * `@wlindabla/event_dispatcher`. Every meaningful moment in the upload\n * lifecycle emits a typed event that your application can listen to:\n *\n * ```\n * IDLE → INITIALIZING → UPLOADING → FINALIZING → COMPLETED\n * ↓ ↓\n * FAILED PAUSED ↔ UPLOADING\n * ↓\n * CANCELLED\n * ```\n *\n * All event name constants are centralized in {@link HttpFileUploaderEvents}.\n *\n * ---\n *\n * ### Subscriber Registration (Required)\n *\n * Before calling `.upload()`, you **must** register the two built-in subscribers\n * on your dispatcher. They handle the HTTP communication for the init and finalize phases:\n *\n * ```typescript\n * // Browser\n * const dispatcher = new BrowserEventDispatcher(document);\n * dispatcher.addSubscriber(new InitializeUploadSubscriber(dispatcher));\n * dispatcher.addSubscriber(new FinalizeUploadSubscriber(dispatcher));\n *\n * // Node.js\n * const dispatcher = new NodeEventDispatcher();\n * dispatcher.addSubscriber(new InitializeUploadSubscriber(dispatcher));\n * dispatcher.addSubscriber(new FinalizeUploadSubscriber(dispatcher));\n * ```\n *\n * ---\n *\n * ### Fluent Builder API\n *\n * The class exposes a fluent API to configure the upload before starting:\n *\n * ```typescript\n * const uploader = new ChunkedFileUploader(dispatcher, cache, options);\n *\n * await uploader\n * .withFile(file)\n * .withEndpoints({\n * init: 'https://api.example.com/upload/init',\n * upload: 'https://api.example.com/upload/chunk',\n * finalize: 'https://api.example.com/upload/finalize'\n * })\n * .upload();\n * ```\n *\n * ---\n *\n * ### Resumable Uploads\n *\n * When `autoSave: true` is set in options, the upload progress is persisted\n * after each successful chunk via the {@link UploadResumeCacheInterface}.\n * A failed or interrupted upload can be resumed later:\n *\n * ```typescript\n * const resumeData = await uploader.loadResumeData(file.name);\n *\n * if (resumeData) {\n * await uploader\n * .withFile(file)\n * .withEndpoints(endpoints)\n * .resumeUpload(resumeData);\n * }\n * ```\n *\n * ---\n *\n * ### Concurrency\n *\n * Multiple chunks can be uploaded simultaneously. The `concurrency` option\n * controls how many parallel uploads are active at any given time.\n * The default value is `3`, which provides a good balance between speed\n * and server/network load:\n *\n * ```typescript\n * // Upload 5 chunks in parallel\n * new ChunkedFileUploader(dispatcher, cache, { concurrency: 5 });\n * ```\n *\n * ---\n *\n * ### Pause, Resume and Cancel\n *\n * The upload can be paused, resumed, or cancelled at any time:\n *\n * ```typescript\n * uploader.pause(); // Pauses after the current chunk finishes\n * uploader.resume(); // Resumes from where it was paused\n * uploader.cancel(); // Aborts immediately via AbortController\n * ```\n *\n * ---\n *\n * ### Cache\n *\n * The library does **not** provide a built-in cache implementation to stay\n * lightweight and environment-agnostic. You must implement\n * {@link UploadResumeCacheInterface} with your preferred storage backend\n * (localStorage, IndexedDB, Redis, filesystem, etc.).\n *\n * ---\n *\n * @author AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * @company INTERNATIONALES WEB APPS & SERVICES\n * @phone +229 0167 25 18 86\n * @linkedin https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * @github https://github.com/Agbokoudjo/file_uploader\n *\n * @version 2.0.1\n * @since 1.0.0\n * @license MIT\n *\n * @see {@link HttpFileUploaderEvents} All event name constants\n * @see {@link UploadResumeCacheInterface} Cache interface to implement\n * @see {@link InitializeUploadSubscriber} Handles the init HTTP phase\n * @see {@link FinalizeUploadSubscriber} Handles the finalize HTTP phase\n * @see {@link UploadOptions} Full configuration reference\n * @see {@link https://github.com/Agbokoudjo/file_uploader | GitHub Repository}\n */\nexport class ChunkedFileUploader {\n private _file: File |null;\n private _endpoints: UploadEndpoints|null;\n \n private isPaused: boolean;\n private startTime: number;\n private uploadedBytes: number;\n private abortController: AbortController;\n private state: UploadState;\n private totalChunks: number;\n private percentage: number;\n private uploadedChunks: number;\n private lastUploadedChunkIndex: number; \n\n /**\n * @param _uploadEventDispatcher: new BrowserEventDispatcher(), //or new NodeJSEventDispatcher() if you have an environment NodeJs\n * @param uploadResumeData: UploadResumeCacheInterface\n * @param options: UploadOptions\n */\n public constructor(\n private readonly _uploadEventDispatcher: EventDispatcherInterface,\n private readonly uploadResumeData: UploadResumeCacheInterface,\n private options: UploadOptions\n ) {\n \n this._file = null;\n this._endpoints = null;\n this.isPaused = false;\n this.startTime = 0;\n this.uploadedBytes = 0;\n this.abortController = new AbortController();\n this.state = UploadState.IDLE;\n this.totalChunks = 0;\n this.percentage = 0;\n this.uploadedChunks = 0;\n this.lastUploadedChunkIndex = -1; \n }\n\n /**\n * Starts the chunked file upload process.\n * \n * @throws {Error} If file or endpoints are not set\n * @throws {InitializeUploadFailureException} If server initialization fails\n * @throws {FileUploadChunkError} If a chunk fails after all retries\n * \n * @example\n * ```typescript\n * const uploader = new ChunkedFileUploader(dispatcher, cache, options);\n * \n * uploader\n * .withFile(file)\n * .withEndpoints({ init, upload, finalize });\n * \n * await uploader.upload();\n * ```\n */\n public async upload(): Promise<void>{\n this.setState(UploadState.INITIALIZING);\n\n const { maxRetries = 3, config, speedMbps, metadata,\n headerInitialzingUpload, concurrency = 3\n } = this.options;\n\n let file: File;\n try {\n file = this.file;\n } catch (error) {\n throw error;\n }\n \n // Generate file hash for integrity check\n const fileHash = await FileUtils.generateFileHash(this.file); \n let fileId: string;\n try {\n const initializationEvent = await this._uploadEventDispatcher.dispatchAsync(\n new InitializingUploadEvent(\n {\n fileHash: fileHash,\n fileName: file.name,\n fileSize: file.size,\n fileType: file.type,\n metadata: metadata,\n endpointInit: this.endPointOptions.init,\n headers: headerInitialzingUpload\n }),\n HttpFileUploaderEvents.INITIALIZE_UPLOAD\n )\n\n fileId = initializationEvent.mediaId;\n } catch (error) {\n this.setState(UploadState.FAILED);\n throw error;\n }\n\n this.setState(UploadState.UPLOADING);\n this.startTime = Date.now();\n this.uploadedBytes = 0;\n this.uploadedChunks = 0;\n this.lastUploadedChunkIndex = -1;\n\n const chunkSize = this.options.chunkSize || FileUtils.calculateChunkSize(file.size, speedMbps, config);\n this.totalChunks = Math.ceil(file.size / chunkSize);\n try {\n await this.uploadChunksWithConcurrency(\n file,\n chunkSize,\n fileId,\n fileHash,\n maxRetries,\n concurrency,\n 0\n );\n\n await this.finalizeUpload(fileId, fileHash);\n \n } catch (error) {\n this.handleUploadFailure(error as Error);\n throw error;\n }\n }\n\n public withFile(file: File): this {\n if (!file) {\n throw new Error('File is required');\n }\n if (file.size === 0) {\n throw new Error('Cannot upload empty file');\n }\n if (!(file instanceof File) || !(file instanceof Blob)) {\n throw new TypeError('Expected File or Blob instance');\n }\n this._file = file;\n return this;\n }\n\n public withEndpoints(endpoints: UploadEndpoints): this {\n if (!endpoints.init || !endpoints.upload || !endpoints.finalize) {\n throw new Error('All endpoints (init, upload, finalize) are required');\n }\n this._endpoints = endpoints;\n return this;\n }\n\n private get endPointOptions():UploadEndpoints {\n if (!this._endpoints) {\n throw new Error('Endpoint URL is required');\n }\n\n return this._endpoints;\n }\n\n private get file(): File{ \n if (!this._file) {\n throw new Error(`\n This operation requires a mandatory file.Did you forget to upload the file? \n Use the withFile(file: File|Blob) function of the ChunkedFileUploader ${this} class that you instantiated.\n `)\n }\n\n return this._file;\n }\n\n /**\n * Upload all chunks with concurrency control using p-limit\n * \n * @param file - File to upload\n * @param chunkSize - Size of each chunk\n * @param fileId - Server file ID\n * @param fileHash - File hash\n * @param maxRetries - Max retry attempts per chunk\n * @param concurrency - Number of concurrent uploads (default: 3)\n */\n private async uploadChunksWithConcurrency(\n file: File,\n chunkSize: number,\n fileId: string,\n fileHash: string,\n maxRetries: number,\n concurrency: number,\n startIndex:number=0\n ): Promise<void> {\n try {\n const limit = pLimit(concurrency);\n\n // Créer toutes les promesses avec limite\n const uploadPromises: Promise<void>[] = [];\n\n for (let chunkIndex = startIndex; chunkIndex < this.totalChunks; chunkIndex++) {\n // Wrapper chaque upload dans le limiteur\n const limitedUpload = limit(() =>\n this.processChunk(\n file,\n chunkIndex,\n chunkSize,\n fileId,\n fileHash,\n maxRetries\n )\n );\n\n uploadPromises.push(limitedUpload);\n }\n\n // Attendre que tous les chunks soient uploadés\n await Promise.all(uploadPromises);\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Process a single chunk: slice, upload with retry, and save progress.\n * \n * @param file - The file being uploaded\n * @param currentChunkIndex - Index of the current chunk (0-based)\n * @param chunkSize - Size of each chunk in bytes\n * @param fileId - Server-provided file/session ID\n * @param fileHash - SHA-256 hash of the file\n * @param maxRetries - Maximum number of retry attempts\n * \n * @throws {UploadCancelledException} If upload is cancelled\n * @throws {FileUploadChunkError} If chunk upload fails after all retries\n */\n private async processChunk(\n file:File,\n currentChunkIndex: number,\n chunkSize:number,\n fileId: string,\n fileHash:string,\n maxRetries:number\n ): Promise<void>{\n try {\n if (this.abortController.signal.aborted) {\n this._uploadEventDispatcher.dispatch(\n new UploadCancelledEvent(\n file.name,\n this.totalChunks,\n this.uploadedBytes,\n this.percentage,\n currentChunkIndex,\n 'Upload cancelled by user',\n Date.now()\n ),\n HttpFileUploaderEvents.UPLOAD_CANCELLED\n )\n \n return;\n }\n\n while (this.isPaused) {\n await this.sleep(100);\n }\n // Calcule où commencer dans le fichier\n const start = currentChunkIndex * chunkSize;\n // chunkIndex=0 → start=0\n // chunkIndex=1 → start=300\n // chunkIndex=2 → start=600\n // chunkIndex=3 → start=900\n\n // Calcule où finir (sans depasser la fin du fichier)\n const end = Math.min(file.size, start + chunkSize);\n // chunkIndex=0 → end=min(1000, 300)=300\n // chunkIndex=1 → end=min(1000, 600)=600\n // chunkIndex=2 → end=min(1000, 900)=900\n // chunkIndex=3 → end=min(1000, 1200)=1000 ← Limité !\n\n // Découpe le morceau\n const chunk = file.slice(start, end);\n // chunkIndex=0 → slice(0, 300) → 300 bytes\n // chunkIndex=1 → slice(300, 600) → 300 bytes\n // chunkIndex=2 → slice(600, 900) → 300 bytes\n // chunkIndex=3 → slice(900, 1000)→ 100 bytes ← Plus petit !\n const chunkInfo: ChunkInfo = {\n index: currentChunkIndex,\n start,\n end,\n size: chunk.size,\n attempt: 0,\n status: 'pending'\n };\n\n this._uploadEventDispatcher.dispatch(\n new UploadChunkStartedEvent(chunkInfo),\n HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_STARTED\n );\n // Upload with retry\n await this.uploadChunkWithRetry(\n chunk,\n chunkInfo,\n fileId,\n fileHash,\n this.totalChunks,\n maxRetries\n );\n\n // Auto-save progress\n if (this.options.autoSave) {\n await this.saveResumeData(fileId,chunkSize);\n }\n } catch (error) {\n throw error;\n \n }\n }\n\n private async uploadChunkWithRetry(\n chunk: Blob,\n chunkInfo: ChunkInfo,\n fileId: string,\n fileHash: string,\n totalChunks: number,\n maxRetries: number\n ): Promise<void> {\n let success = false;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries && !success; attempt++) {\n chunkInfo.attempt = attempt + 1;\n chunkInfo.status = 'uploading';\n\n try {\n const response = await this.uploadChunk(chunk, chunkInfo, fileId, fileHash, totalChunks);\n success = true;\n chunkInfo.status = 'success';\n\n this.updateProgress(chunk.size, chunkInfo.index)\n\n this.notifyProgress(\n this.uploadedChunks,\n totalChunks,\n this.file.size,\n response\n );\n return;\n } catch (error) {\n if (error instanceof ChunkUploadHttpErrorException) {\n this._uploadEventDispatcher.dispatch(\n new ChunkUploadHttpErrorResponseEvent(\n error.errorPayload,\n error.statusResponse,\n this.endPointOptions.upload,\n chunkInfo),\n HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_HTTP_ERROR_RESPONSE\n )\n }\n\n lastError = error as Error;\n chunkInfo.status = 'error';\n\n const chunkError: ChunkError= {\n chunk: chunkInfo,\n error: lastError,\n attempt: attempt + 1,\n willRetry: attempt < maxRetries - 1\n };\n\n if(error instanceof HttpFetchError){\n this._uploadEventDispatcher.dispatch(chunkError,HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_FAILED)\n }\n\n if (attempt < maxRetries - 1) {\n const delay = Math.pow(2, attempt) * 1000;\n await this.sleep(delay);\n\n console.info(`Retry #${attempt + 2} in ${delay / 1000}s...`);\n }\n }\n }\n\n if (!success) {\n const fileUploadChunkError = new FileUploadChunkError(\n `Failed to upload chunk ${chunkInfo.index} after ${maxRetries} attempts`,\n {\n chunk: chunkInfo,\n error: lastError!,\n attempt: maxRetries,\n willRetry: false\n }\n );\n\n this._uploadEventDispatcher.dispatch(\n fileUploadChunkError,\n HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_MAXRETRY_EXPIRE\n )\n \n throw fileUploadChunkError;\n }\n\n }\n\n private async uploadChunk(\n chunk: Blob,\n chunkInfo: ChunkInfo,\n mediaIdFromServer: string,\n fileHash: string,\n totalChunks: number\n ): Promise<FetchResponseInterface> {\n const media = this.file;\n const chunkFormData = createChunkFormData(\n chunk,\n {\n chunkIndex: chunkInfo.index,\n mediaId: mediaIdFromServer,\n fileSize: media.size,\n fileName: media.name,\n fileHash: fileHash,\n totalChunks: totalChunks\n }\n );\n\n try {\n const response_of_server = await safeFetch({\n url: this.endPointOptions.upload,\n headers: this.options.headers,\n data: chunkFormData,\n methodSend: \"POST\",\n responseType: \"json\",\n timeout: this.options.timeout ?? 60000,\n retryCount: 2,\n retryOnStatusCode: false,\n signal: this.createChunkAbortSignal()\n })\n const statusResponse = response_of_server.status;\n //if the server send a response which not success with status code(>=4XX ou >=5XX)\n if (response_of_server.failed) {\n throw new ChunkUploadHttpErrorException(response_of_server.data, statusResponse)\n }\n\n return response_of_server;\n } catch (error) {\n throw error;\n }\n\n }\n\n private createChunkAbortSignal(): AbortSignal {\n const chunkController = new AbortController();\n\n this.abortController.signal.addEventListener('abort', () => {\n chunkController.abort();\n });\n\n return chunkController.signal;\n }\n\n private notifyProgress(\n uploadedChunks: number,\n totalChunks: number,\n totalBytes: number,\n httpResponse: FetchResponseInterface): void {\n // Temps écoulé (minimum 0.1s pour éviter division par zéro)\n const elapsed = Math.max((Date.now() - this.startTime) / 1000, 0.1);\n const speed = this.uploadedBytes / elapsed; // Vitesse instantanée\n const remainingBytes = totalBytes - this.uploadedBytes; // Bytes restants\n // Temps restant (null si pas assez de données)\n const estimatedTimeRemaining = uploadedChunks < 2 ? null : remainingBytes / speed;\n\n this.percentage = Math.round((this.uploadedBytes / totalBytes) * 100);\n\n const progress: UploadProgress = {\n uploadedChunks,\n totalChunks,\n uploadedBytes: this.uploadedBytes,\n totalBytes,\n percentage: this.percentage,\n currentChunk: uploadedChunks,\n speed, // bytes/seconde\n estimatedTimeRemaining, // secondes (ou null)\n elapsed // secondes écoulées\n };\n\n this._uploadEventDispatcher.dispatch(\n new UploadProgressEvent(\n progress,\n httpResponse.data,\n httpResponse.status\n )\n )\n \n console.info(\n `Progress: ${this.percentage}% | ` +\n `Speed: ${FileUtils.formatBytes(speed)}/s | ` +\n `ETA: ${estimatedTimeRemaining ? FileUtils.formatDuration(estimatedTimeRemaining) : 'Calculating...'}`\n );\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * Save current upload progress to cache for resume capability\n * \n * @param fileId - Server-provided file/session ID\n * @param chunkSize - Size of each chunk in bytes\n * @returns Saved resume data\n */\n private async saveResumeData(fileId: string, chunkSize: number): Promise<ResumeData> {\n const data: ResumeData = {\n fileId: fileId,\n fileName: this.file.name,\n fileSize: this.file.size,\n uploadedChunks: this.uploadedChunks,\n lastChunkIndex: this.lastUploadedChunkIndex,\n lastBytePosition: this.uploadedBytes,\n chunkSize: chunkSize,\n concurrency:this.options.concurrency || 3\n };\n\n await this.uploadResumeData.setItem(`upload_${this.file.name}`, data);\n\n console.info(\n `Resume data saved: ${this.uploadedChunks}/${Math.ceil(this.file.size / chunkSize)} chunks, ` +\n `last chunk index: ${this.lastUploadedChunkIndex}`\n );\n\n return data;\n }\n\n private setState(newState: UploadState): void {\n const oldState = this.state;\n this.state = newState;\n\n this._uploadEventDispatcher.dispatch(\n new UploadStateChangedEvent(\n oldState,\n newState,\n Date.now()\n ),\n HttpFileUploaderEvents.UPLOAD_STATE_CHANGED\n )\n \n }\n\n public getState(): UploadState {\n return this.state;\n }\n\n private handleUploadFailure(error: Error): void {\n this.setState(UploadState.FAILED);\n\n this._uploadEventDispatcher.dispatch(error, HttpFileUploaderEvents.DOWNLOAD_MEDIA_FAILURE);\n console.error('Upload failed:', error);\n }\n\n public cancel(): void {\n this.abortController.abort();\n this.setState(UploadState.CANCELLED);\n }\n\n public pause(): void {\n this.isPaused = true;\n this.setState(UploadState.PAUSED);\n this._uploadEventDispatcher.dispatch(\n new UploadPausedEvent(\n this.file.name,\n this.totalChunks,\n this.uploadedBytes,\n this.percentage,\n Date.now()\n ),\n HttpFileUploaderEvents.UPLOAD_PAUSED\n );\n }\n\n\n public resume(): void {\n this.isPaused = false;\n this.setState(UploadState.UPLOADING);\n this._uploadEventDispatcher.dispatch(\n new UploadResumedEvent(\n this.file.name,\n this.totalChunks,\n this.uploadedBytes, \n this.percentage),\n HttpFileUploaderEvents.UPLOAD_RESUMED,\n );\n }\n\n /**\n * Load previously saved resume data\n * \n * @param fileName - Name of the file to resume\n * @returns Resume data or null if not found\n */\n async loadResumeData(fileName: string): Promise<ResumeData | null> {\n try {\n const data = await this.uploadResumeData.getItem(`upload_${fileName}`);\n\n if (data) {\n console.info(\n `Resume data loaded: ${data.uploadedChunks} chunks uploaded, ` +\n `last index: ${data.lastChunkIndex}`\n );\n }\n return data;\n } catch (error) {\n console.warn(`No resume data found for ${fileName}`);\n return null;\n }\n }\n\n /**\n * Resume upload from saved state\n * \n * @param resumeData - Previously saved resume data\n * @returns Upload result\n */\n public async resumeUpload(resumeData: ResumeData): Promise<void> {\n const __message = `Resuming upload from chunk ${resumeData.lastChunkIndex + 1} ` +\n `(${resumeData.uploadedChunks} chunks already uploaded)`;\n\n // Restore state\n this.uploadedBytes = resumeData.lastBytePosition;\n this.uploadedChunks = resumeData.uploadedChunks;\n this.lastUploadedChunkIndex = resumeData.lastChunkIndex;\n\n // Calculate adjusted start time for accurate speed calculation\n const assumedSpeed = 500000; // 500 KB/s assumed\n const timeAlreadySpent = resumeData.lastBytePosition / assumedSpeed;\n this.startTime = Date.now() - (timeAlreadySpent * 1000);\n\n const { maxRetries = 3 } = this.options;\n const fileHash = await FileUtils.generateFileHash(this.file);\n const chunkSize = resumeData.chunkSize;\n this.totalChunks = Math.ceil(this.file.size / chunkSize);\n\n try {\n this._uploadEventDispatcher.dispatch(\n new ResumeUploadEvent(resumeData,__message),\n HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_RESUME\n )\n await this.uploadChunksWithConcurrency(\n this.file,\n chunkSize,\n resumeData.fileId,\n fileHash,\n maxRetries,\n resumeData.concurrency,\n resumeData.lastChunkIndex + 1\n )\n ;\n await this.finalizeUpload(resumeData.fileId, fileHash);\n\n } catch (error) {\n this.handleUploadFailure(error as Error);\n throw error;\n }\n }\n\n private updateProgress(chunkSize: number, chunkIndex: number): void {\n this.uploadedBytes += chunkSize;\n this.uploadedChunks++;\n this.lastUploadedChunkIndex = Math.max(this.lastUploadedChunkIndex,chunkIndex);\n }\n \n private async finalizeUpload(mediaId: string, fileHash: string): Promise<void> {\n try {\n \n const finalizeUploadEvent = await this._uploadEventDispatcher.dispatchAsync(\n new FinalizeUploadEvent(\n this.endPointOptions.finalize,\n mediaId,\n fileHash,\n this.options.headerFinalezingUpload)\n ,\n HttpFileUploaderEvents.FINALIZE_UPLOAD\n )\n\n this.setState(UploadState.FINALIZING);\n\n\n const duration = (Date.now() - this.startTime) / 1000;\n\n const uploadResult: UploadResult = {\n success: true,\n finalizeUploadResponse: finalizeUploadEvent.hasResponse() ? finalizeUploadEvent.getResponse() : null ,\n totalChunks: this.totalChunks,\n totalBytes: this.file.size,\n duration,\n averageSpeed: this.file.size / duration,\n fileId: mediaId\n };\n\n this.setState(UploadState.COMPLETED);\n\n this._uploadEventDispatcher.dispatch(\n new UploadMediaCompleteEvent(uploadResult),HttpFileUploaderEvents.DOWNLOAD_MEDIA_COMPLETE\n )\n\n } catch (error) {\n throw error;\n }\n }\n}"]}
@@ -1,5 +1,4 @@
1
- 'use strict';
2
-
1
+ // src/types/index.ts
3
2
  var UploadState = /* @__PURE__ */ ((UploadState2) => {
4
3
  UploadState2["IDLE"] = "idle";
5
4
  UploadState2["INITIALIZING"] = "initializing";
@@ -11,7 +10,7 @@ var UploadState = /* @__PURE__ */ ((UploadState2) => {
11
10
  UploadState2["FAILED"] = "failed";
12
11
  return UploadState2;
13
12
  })(UploadState || {});
14
- const DEFAULT_CONFIG = Object.freeze({
13
+ var DEFAULT_CONFIG = Object.freeze({
15
14
  defaultChunkSizeMB: 50,
16
15
  slowSpeedThresholdMbps: 5,
17
16
  slowSpeedChunkSizeMB: 2,
@@ -24,7 +23,6 @@ const DEFAULT_CONFIG = Object.freeze({
24
23
  ]
25
24
  });
26
25
 
27
- exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
28
- exports.UploadState = UploadState;
29
- //# sourceMappingURL=index.js.map
30
- //# sourceMappingURL=index.js.map
26
+ export { DEFAULT_CONFIG, UploadState };
27
+ //# sourceMappingURL=chunk-X757PBC5.js.map
28
+ //# sourceMappingURL=chunk-X757PBC5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/index.ts"],"names":["UploadState"],"mappings":";AAkEO,IAAK,WAAA,qBAAAA,YAAAA,KAAL;AACH,EAAAA,aAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,aAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,aAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,aAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AARD,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAiCL,IAAM,cAAA,GAA4C,OAAO,MAAA,CAAO;AAAA,EACnE,kBAAA,EAAoB,EAAA;AAAA,EACpB,sBAAA,EAAwB,CAAA;AAAA,EACxB,oBAAA,EAAsB,CAAA;AAAA,EACtB,kBAAA,EAAoB;AAAA,IAChB,EAAE,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,EAAA,EAAG;AAAA,IAClC,EAAE,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,GAAA,EAAI;AAAA,IACnC,EAAE,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,GAAA,EAAI;AAAA,IACnC,EAAE,SAAA,EAAW,GAAA,EAAM,WAAA,EAAa,GAAA,EAAI;AAAA,IACpC,EAAE,SAAA,EAAW,QAAA,EAAU,WAAA,EAAa,GAAA;AAAI;AAEhD,CAAC","file":"chunk-X757PBC5.js","sourcesContent":["/*\n * This file is part of the project by AGBOKOUDJO Franck.\n *\n * (c) AGBOKOUDJO Franck <internationaleswebservices@gmail.com>\n * Phone: +229 0167 25 18 86\n * LinkedIn: https://www.linkedin.com/in/internationales-web-apps-services-120520193/\n * Company: INTERNATIONALES WEB APPS & SERVICES\n *\n * For more information, please feel free to contact the author.\n */\n\nimport { FetchResponseInterface } from \"@wlindabla/http_client\";\n\nexport interface UploadOptions {\n autoSave?: boolean,\n chunkSize?: number;\n speedMbps?: number;\n config?: ChunkSizeConfig;\n headers?: HeadersInit;\n chunkOtherData?: Record<string, any>;\n metadata?: Record<string, any>;\n maxRetries?: number;\n timeout?: number;\n initTimeout?: number;\n headerInitialzingUpload?: HeadersInit;\n headerFinalezingUpload?: HeadersInit;\n concurrency?: number; // Default: 3\n}\n\nexport interface InitializeUploadOptions{\n metadata?: Record<string, any>;\n fileHash: string;\n fileName: string;\n fileSize: number;\n fileType: string;\n endpointInit: string | URL;\n headers?: HeadersInit;\n}\n\nexport interface UploadEndpoints{\n init: string | URL;\n upload: string | URL;\n finalize: string | URL;\n}\n\nexport interface ChunkSizeConfig {\n defaultChunkSizeMB: number;\n slowSpeedThresholdMbps: number;\n slowSpeedChunkSizeMB: number;\n fileSizeThresholds: Array<{\n maxSizeMB: number;\n chunkSizeMB: number;\n }>;\n}\n\nexport type UploadStatus = 'pending' | 'uploading' | 'success' | 'error';\n\nexport interface ChunkInfo {\n index: number;\n start: number;\n end: number;\n size: number;\n attempt: number;\n status: UploadStatus;\n}\n\nexport enum UploadState {\n IDLE = 'idle',\n INITIALIZING = 'initializing',\n UPLOADING = 'uploading',\n PAUSED = 'paused',\n CANCELLED = 'cancelled',\n FINALIZING = 'finalizing',\n COMPLETED = 'completed',\n FAILED = 'failed'\n}\n\nexport interface UploadResult {\n success: boolean;\n fileId?: string;\n totalChunks: number;\n totalBytes: number;\n duration: number;\n averageSpeed: number;\n finalizeUploadResponse?: FetchResponseInterface | null;\n statusResponse?: number;\n}\n\nexport interface ResumeData {\n fileId: string;\n fileName: string;\n fileSize: number;\n uploadedChunks: number;\n lastChunkIndex: number;\n lastBytePosition: number;\n chunkSize: number;\n concurrency: number;\n}\n\nexport const DEFAULT_CONFIG: Readonly<ChunkSizeConfig> = Object.freeze({\n defaultChunkSizeMB: 50,\n slowSpeedThresholdMbps: 5,\n slowSpeedChunkSizeMB: 2,\n fileSizeThresholds: [\n { maxSizeMB: 200, chunkSizeMB: 50 },\n { maxSizeMB: 400, chunkSizeMB: 100 },\n { maxSizeMB: 800, chunkSizeMB: 300 },\n { maxSizeMB: 1000, chunkSizeMB: 500 },\n { maxSizeMB: Infinity, chunkSizeMB: 700 }\n ]\n});\n\nexport interface UploadProgress {\n uploadedChunks: number;\n totalChunks: number;\n uploadedBytes: number;\n totalBytes: number;\n percentage: number;\n currentChunk: number;\n speed?: number; // bytes per second\n estimatedTimeRemaining?: number | null; // seconds\n elapsed: number;// secondes écoulées\n}\nexport interface ChunkError {\n chunk: ChunkInfo;\n error: Error;\n attempt: number;\n willRetry: boolean;\n}\n\n/**\n * Expected response structure from initialize endpoint\n */\nexport interface InitializeUploadResponse {\n mediaIdFromServer?: string | number;\n sessionId?: string | number;\n uploadId?: string | number;\n mediaId?: string | number;\n message?: string | number;\n [key: string]: any; // Allow extra fields\n}"]}
@@ -0,0 +1,271 @@
1
+ import { EventDispatcherInterface } from '@wlindabla/event_dispatcher';
2
+ import { UploadOptions, UploadEndpoints, UploadState, ResumeData } from '../types/index.mjs';
3
+ import { UploadResumeCacheInterface } from '../cache/index.mjs';
4
+ import '@wlindabla/http_client';
5
+
6
+ /**
7
+ * ChunkedFileUploader
8
+ *
9
+ * A production-ready, event-driven chunked file upload engine for Browser and Node.js.
10
+ *
11
+ * Designed and developed by **AGBOKOUDJO Franck** at
12
+ * **INTERNATIONALES WEB APPS & SERVICES**, this class provides a robust,
13
+ * framework-agnostic solution for uploading large files to a remote server
14
+ * by splitting them into smaller chunks and sending them in parallel with
15
+ * configurable concurrency control.
16
+ *
17
+ * ---
18
+ *
19
+ * ### How It Works
20
+ *
21
+ * The upload process follows a strict three-phase lifecycle:
22
+ *
23
+ * 1. **Initialization** — A session is opened with the server via the `init` endpoint.
24
+ * The file is identified by its name, size, type, and a SHA-256 hash of its
25
+ * first megabyte. The server returns a unique `mediaId` that identifies the session.
26
+ *
27
+ * 2. **Chunk Upload** — The file is sliced into fixed-size chunks and uploaded
28
+ * concurrently using `p-limit`. Each chunk carries its index, the total number
29
+ * of chunks, and the session `mediaId`. Failed chunks are retried automatically
30
+ * with exponential backoff up to `maxRetries` attempts.
31
+ *
32
+ * 3. **Finalization** — Once all chunks are successfully uploaded, the `finalize`
33
+ * endpoint is called to instruct the server to assemble the chunks into the
34
+ * final file.
35
+ *
36
+ * ---
37
+ *
38
+ * ### Event-Driven Architecture
39
+ *
40
+ * This class follows the **Symfony EventDispatcher pattern** via
41
+ * `@wlindabla/event_dispatcher`. Every meaningful moment in the upload
42
+ * lifecycle emits a typed event that your application can listen to:
43
+ *
44
+ * ```
45
+ * IDLE → INITIALIZING → UPLOADING → FINALIZING → COMPLETED
46
+ * ↓ ↓
47
+ * FAILED PAUSED ↔ UPLOADING
48
+ * ↓
49
+ * CANCELLED
50
+ * ```
51
+ *
52
+ * All event name constants are centralized in {@link HttpFileUploaderEvents}.
53
+ *
54
+ * ---
55
+ *
56
+ * ### Subscriber Registration (Required)
57
+ *
58
+ * Before calling `.upload()`, you **must** register the two built-in subscribers
59
+ * on your dispatcher. They handle the HTTP communication for the init and finalize phases:
60
+ *
61
+ * ```typescript
62
+ * // Browser
63
+ * const dispatcher = new BrowserEventDispatcher(document);
64
+ * dispatcher.addSubscriber(new InitializeUploadSubscriber(dispatcher));
65
+ * dispatcher.addSubscriber(new FinalizeUploadSubscriber(dispatcher));
66
+ *
67
+ * // Node.js
68
+ * const dispatcher = new NodeEventDispatcher();
69
+ * dispatcher.addSubscriber(new InitializeUploadSubscriber(dispatcher));
70
+ * dispatcher.addSubscriber(new FinalizeUploadSubscriber(dispatcher));
71
+ * ```
72
+ *
73
+ * ---
74
+ *
75
+ * ### Fluent Builder API
76
+ *
77
+ * The class exposes a fluent API to configure the upload before starting:
78
+ *
79
+ * ```typescript
80
+ * const uploader = new ChunkedFileUploader(dispatcher, cache, options);
81
+ *
82
+ * await uploader
83
+ * .withFile(file)
84
+ * .withEndpoints({
85
+ * init: 'https://api.example.com/upload/init',
86
+ * upload: 'https://api.example.com/upload/chunk',
87
+ * finalize: 'https://api.example.com/upload/finalize'
88
+ * })
89
+ * .upload();
90
+ * ```
91
+ *
92
+ * ---
93
+ *
94
+ * ### Resumable Uploads
95
+ *
96
+ * When `autoSave: true` is set in options, the upload progress is persisted
97
+ * after each successful chunk via the {@link UploadResumeCacheInterface}.
98
+ * A failed or interrupted upload can be resumed later:
99
+ *
100
+ * ```typescript
101
+ * const resumeData = await uploader.loadResumeData(file.name);
102
+ *
103
+ * if (resumeData) {
104
+ * await uploader
105
+ * .withFile(file)
106
+ * .withEndpoints(endpoints)
107
+ * .resumeUpload(resumeData);
108
+ * }
109
+ * ```
110
+ *
111
+ * ---
112
+ *
113
+ * ### Concurrency
114
+ *
115
+ * Multiple chunks can be uploaded simultaneously. The `concurrency` option
116
+ * controls how many parallel uploads are active at any given time.
117
+ * The default value is `3`, which provides a good balance between speed
118
+ * and server/network load:
119
+ *
120
+ * ```typescript
121
+ * // Upload 5 chunks in parallel
122
+ * new ChunkedFileUploader(dispatcher, cache, { concurrency: 5 });
123
+ * ```
124
+ *
125
+ * ---
126
+ *
127
+ * ### Pause, Resume and Cancel
128
+ *
129
+ * The upload can be paused, resumed, or cancelled at any time:
130
+ *
131
+ * ```typescript
132
+ * uploader.pause(); // Pauses after the current chunk finishes
133
+ * uploader.resume(); // Resumes from where it was paused
134
+ * uploader.cancel(); // Aborts immediately via AbortController
135
+ * ```
136
+ *
137
+ * ---
138
+ *
139
+ * ### Cache
140
+ *
141
+ * The library does **not** provide a built-in cache implementation to stay
142
+ * lightweight and environment-agnostic. You must implement
143
+ * {@link UploadResumeCacheInterface} with your preferred storage backend
144
+ * (localStorage, IndexedDB, Redis, filesystem, etc.).
145
+ *
146
+ * ---
147
+ *
148
+ * @author AGBOKOUDJO Franck <internationaleswebservices@gmail.com>
149
+ * @company INTERNATIONALES WEB APPS & SERVICES
150
+ * @phone +229 0167 25 18 86
151
+ * @linkedin https://www.linkedin.com/in/internationales-web-apps-services-120520193/
152
+ * @github https://github.com/Agbokoudjo/file_uploader
153
+ *
154
+ * @version 2.0.1
155
+ * @since 1.0.0
156
+ * @license MIT
157
+ *
158
+ * @see {@link HttpFileUploaderEvents} All event name constants
159
+ * @see {@link UploadResumeCacheInterface} Cache interface to implement
160
+ * @see {@link InitializeUploadSubscriber} Handles the init HTTP phase
161
+ * @see {@link FinalizeUploadSubscriber} Handles the finalize HTTP phase
162
+ * @see {@link UploadOptions} Full configuration reference
163
+ * @see {@link https://github.com/Agbokoudjo/file_uploader | GitHub Repository}
164
+ */
165
+ declare class ChunkedFileUploader {
166
+ private readonly _uploadEventDispatcher;
167
+ private readonly uploadResumeData;
168
+ private options;
169
+ private _file;
170
+ private _endpoints;
171
+ private isPaused;
172
+ private startTime;
173
+ private uploadedBytes;
174
+ private abortController;
175
+ private state;
176
+ private totalChunks;
177
+ private percentage;
178
+ private uploadedChunks;
179
+ private lastUploadedChunkIndex;
180
+ /**
181
+ * @param _uploadEventDispatcher: new BrowserEventDispatcher(), //or new NodeJSEventDispatcher() if you have an environment NodeJs
182
+ * @param uploadResumeData: UploadResumeCacheInterface
183
+ * @param options: UploadOptions
184
+ */
185
+ constructor(_uploadEventDispatcher: EventDispatcherInterface, uploadResumeData: UploadResumeCacheInterface, options: UploadOptions);
186
+ /**
187
+ * Starts the chunked file upload process.
188
+ *
189
+ * @throws {Error} If file or endpoints are not set
190
+ * @throws {InitializeUploadFailureException} If server initialization fails
191
+ * @throws {FileUploadChunkError} If a chunk fails after all retries
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * const uploader = new ChunkedFileUploader(dispatcher, cache, options);
196
+ *
197
+ * uploader
198
+ * .withFile(file)
199
+ * .withEndpoints({ init, upload, finalize });
200
+ *
201
+ * await uploader.upload();
202
+ * ```
203
+ */
204
+ upload(): Promise<void>;
205
+ withFile(file: File): this;
206
+ withEndpoints(endpoints: UploadEndpoints): this;
207
+ private get endPointOptions();
208
+ private get file();
209
+ /**
210
+ * Upload all chunks with concurrency control using p-limit
211
+ *
212
+ * @param file - File to upload
213
+ * @param chunkSize - Size of each chunk
214
+ * @param fileId - Server file ID
215
+ * @param fileHash - File hash
216
+ * @param maxRetries - Max retry attempts per chunk
217
+ * @param concurrency - Number of concurrent uploads (default: 3)
218
+ */
219
+ private uploadChunksWithConcurrency;
220
+ /**
221
+ * Process a single chunk: slice, upload with retry, and save progress.
222
+ *
223
+ * @param file - The file being uploaded
224
+ * @param currentChunkIndex - Index of the current chunk (0-based)
225
+ * @param chunkSize - Size of each chunk in bytes
226
+ * @param fileId - Server-provided file/session ID
227
+ * @param fileHash - SHA-256 hash of the file
228
+ * @param maxRetries - Maximum number of retry attempts
229
+ *
230
+ * @throws {UploadCancelledException} If upload is cancelled
231
+ * @throws {FileUploadChunkError} If chunk upload fails after all retries
232
+ */
233
+ private processChunk;
234
+ private uploadChunkWithRetry;
235
+ private uploadChunk;
236
+ private createChunkAbortSignal;
237
+ private notifyProgress;
238
+ private sleep;
239
+ /**
240
+ * Save current upload progress to cache for resume capability
241
+ *
242
+ * @param fileId - Server-provided file/session ID
243
+ * @param chunkSize - Size of each chunk in bytes
244
+ * @returns Saved resume data
245
+ */
246
+ private saveResumeData;
247
+ private setState;
248
+ getState(): UploadState;
249
+ private handleUploadFailure;
250
+ cancel(): void;
251
+ pause(): void;
252
+ resume(): void;
253
+ /**
254
+ * Load previously saved resume data
255
+ *
256
+ * @param fileName - Name of the file to resume
257
+ * @returns Resume data or null if not found
258
+ */
259
+ loadResumeData(fileName: string): Promise<ResumeData | null>;
260
+ /**
261
+ * Resume upload from saved state
262
+ *
263
+ * @param resumeData - Previously saved resume data
264
+ * @returns Upload result
265
+ */
266
+ resumeUpload(resumeData: ResumeData): Promise<void>;
267
+ private updateProgress;
268
+ private finalizeUpload;
269
+ }
270
+
271
+ export { ChunkedFileUploader };
@@ -0,0 +1,12 @@
1
+ export { ChunkedFileUploader } from '../chunk-TONVXBLH.js';
2
+ import '../chunk-NXYS73I4.js';
3
+ import '../chunk-MFYC4PBP.js';
4
+ import '../chunk-X757PBC5.js';
5
+ import '../chunk-JDL3U4OX.js';
6
+ import '../chunk-LD2DWZRJ.js';
7
+ import '../chunk-BNMI7DW3.js';
8
+ import '../chunk-3JTTZCSQ.js';
9
+ import '../chunk-6225YMFE.js';
10
+ import '../chunk-7QVYU63E.js';
11
+ //# sourceMappingURL=index.js.map
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,27 @@
1
+ import { ChunkInfo, UploadStatus } from '../../types/index.mjs';
2
+ import '@wlindabla/http_client';
3
+
4
+ /**
5
+ * Event data for MEDIA_CHUNK_UPLOAD_HTTP_ERROR_RESPONSE
6
+ */
7
+ declare class ChunkUploadHttpErrorResponseEvent {
8
+ readonly errorPayload: string | Record<string, string | unknown> | unknown;
9
+ readonly statusResponse: number;
10
+ readonly urlEndpoint: string | URL | Request;
11
+ readonly chunkInfo: ChunkInfo;
12
+ constructor(errorPayload: string | Record<string, string | unknown> | unknown, statusResponse: number, urlEndpoint: string | URL | Request, chunkInfo: ChunkInfo);
13
+ get chunkIndex(): number;
14
+ }
15
+ /**
16
+ * Event data for MEDIA_CHUNK_UPLOAD_STARTED
17
+ */
18
+ declare class UploadChunkStartedEvent {
19
+ private readonly _chunkInfo;
20
+ constructor(_chunkInfo: ChunkInfo);
21
+ get start(): number;
22
+ get end(): number;
23
+ get uploadStatus(): UploadStatus;
24
+ get chunkIndex(): number;
25
+ }
26
+
27
+ export { ChunkUploadHttpErrorResponseEvent, UploadChunkStartedEvent };
@@ -0,0 +1,4 @@
1
+ export { ChunkUploadHttpErrorResponseEvent, UploadChunkStartedEvent } from '../../chunk-LD2DWZRJ.js';
2
+ import '../../chunk-7QVYU63E.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,64 @@
1
+ import { BaseEvent } from '@wlindabla/event_dispatcher';
2
+ import { ResumeData, UploadResult } from '../../types/index.mjs';
3
+ import { ResponseEventInterface } from '@wlindabla/http_client/events';
4
+ import { FetchResponseInterface } from '@wlindabla/http_client';
5
+
6
+ /**
7
+ * Event data for MEDIA_CHUNK_UPLOAD_RESUME
8
+ */
9
+ declare class ResumeUploadEvent {
10
+ private readonly __resumeData;
11
+ readonly message: string;
12
+ constructor(__resumeData: ResumeData, message: string);
13
+ get mediaId(): string | number;
14
+ get fileName(): string;
15
+ get uploadedChunks(): number;
16
+ get lastChunkIndex(): number;
17
+ get lastBytePosition(): number;
18
+ get chunkSize(): number;
19
+ get fileSize(): number;
20
+ }
21
+ /**
22
+ * Event data for DOWNLOAD_MEDIA_COMPLETE
23
+ */
24
+ declare class UploadMediaCompleteEvent {
25
+ private readonly _uploadResult;
26
+ constructor(_uploadResult: UploadResult);
27
+ get success(): boolean;
28
+ get mediaId(): string | number;
29
+ get totalBytes(): number;
30
+ get totalChunks(): number;
31
+ get finalizeUploadHttpResponse(): any;
32
+ get operationDuration(): number;
33
+ get averageSpeed(): number;
34
+ }
35
+ declare class FinalizeUploadFailureEvent extends BaseEvent {
36
+ readonly error: Error;
37
+ readonly status?: number | undefined;
38
+ readonly errorData?: any | undefined;
39
+ readonly responseData?: any | undefined;
40
+ readonly isNetworkError?: boolean | undefined;
41
+ constructor(error: Error, status?: number | undefined, errorData?: any | undefined, responseData?: any | undefined, isNetworkError?: boolean | undefined);
42
+ }
43
+ declare class FinalizeUploadEvent extends BaseEvent implements ResponseEventInterface {
44
+ readonly endPoint: string | URL;
45
+ readonly mediaId: string;
46
+ readonly mediaHash: string;
47
+ readonly headers?: HeadersInit | undefined;
48
+ private fetchResponse;
49
+ constructor(endPoint: string | URL, mediaId: string, mediaHash: string, headers?: HeadersInit | undefined);
50
+ /**
51
+ * Returns the response
52
+ */
53
+ getResponse(): FetchResponseInterface | null;
54
+ /**
55
+ * Sets the response
56
+ */
57
+ setResponse(response: FetchResponseInterface): void;
58
+ /**
59
+ * Returns whether a response was set
60
+ */
61
+ hasResponse(): boolean;
62
+ }
63
+
64
+ export { FinalizeUploadEvent, FinalizeUploadFailureEvent, ResumeUploadEvent, UploadMediaCompleteEvent };
@@ -0,0 +1,4 @@
1
+ export { FinalizeUploadEvent, FinalizeUploadFailureEvent, ResumeUploadEvent, UploadMediaCompleteEvent } from '../../chunk-BNMI7DW3.js';
2
+ import '../../chunk-7QVYU63E.js';
3
+ //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,95 @@
1
+ export { InitializeUploadFailureEvent, InitializeUploadStartedEvent, InitializeUploadSuccessEvent, InitializingUploadEvent } from './initialize/index.mjs';
2
+ export { UploadCancelledEvent, UploadPausedEvent, UploadProgressEvent, UploadResumedEvent, UploadStateChangedEvent } from './state/index.mjs';
3
+ export { ChunkUploadHttpErrorResponseEvent, UploadChunkStartedEvent } from './chunk/index.mjs';
4
+ export { FinalizeUploadEvent, FinalizeUploadFailureEvent, ResumeUploadEvent, UploadMediaCompleteEvent } from './complete/index.mjs';
5
+ import '../types/index.mjs';
6
+ import '@wlindabla/http_client';
7
+ import '@wlindabla/event_dispatcher';
8
+ import '@wlindabla/http_client/events';
9
+
10
+ /**
11
+ * HttpFileUploaderEvents - Event Constants for File Upload Operations
12
+ *
13
+ * This abstract class provides a centralized collection of event name constants
14
+ * used throughout the file upload lifecycle. It follows the Symfony event
15
+ * dispatcher pattern, providing a type-safe way to reference events.
16
+ *
17
+ * The events are organized into five categories:
18
+ * - **Initialize Events**: Events related to upload session initialization
19
+ * - **Chunk Upload Events**: Events fired during individual chunk uploads
20
+ * - **Upload State Events**: Events tracking upload state changes (pause, resume, cancel)
21
+ * - **Completion Events**: Events fired when upload completes or fails
22
+ * - **Metadata Events**: Events related to media metadata operations
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { HttpFileUploaderEvents } from '@wlindabla/file_uploader';
27
+ *
28
+ * // Listen to chunk upload success
29
+ * dispatcher.addListener(
30
+ * HttpFileUploaderEvents.MEDIA_CHUNK_UPLOAD_SUCCESS,
31
+ * (event: ChunkUploadSuccessEvent) => {
32
+ * console.log('Chunk uploaded:', event.progress);
33
+ * }
34
+ * );
35
+ *
36
+ * // Listen to upload state changes
37
+ * dispatcher.addListener(
38
+ * HttpFileUploaderEvents.UPLOAD_STATE_CHANGED,
39
+ * (event: UploadStateChangedEvent) => {
40
+ * console.log(`State changed: ${event.oldState} → ${event.newState}`);
41
+ * }
42
+ * );
43
+ * ```
44
+ *
45
+ * @author AGBOKOUDJO Franck <internationaleswebservices@gmail.com>
46
+ * @version 1.0.0
47
+ * @since 1.0.0
48
+ *
49
+ * @see {@link https://github.com/Agbokoudjo/file_uploader | GitHub Repository}
50
+ * @see {@link EventDispatcherInterface} for event dispatcher usage
51
+ */
52
+ declare abstract class HttpFileUploaderEvents {
53
+ static readonly INITIALIZE_UPLOAD = "initializingUpload";
54
+ /** Dispatched when upload initialization starts */
55
+ static readonly INITIALIZE_UPLOAD_STARTED = "initializeUploadStarted";
56
+ /** Dispatched when upload initialization succeeds */
57
+ static readonly INITIALIZE_UPLOAD_SUCCESS = "initializeUploadSuccess";
58
+ /** Dispatched when upload initialization fails */
59
+ static readonly INITIALIZE_UPLOAD_FAILURE = "initializeUploadFailure";
60
+ /** Dispatched when a chunk upload starts */
61
+ static readonly MEDIA_CHUNK_UPLOAD_STARTED = "mediaChunkUploadStarted";
62
+ /** Dispatched when a chunk is uploaded successfully */
63
+ static readonly MEDIA_CHUNK_UPLOAD_SUCCESS = "mediaChunkUploadSuccess";
64
+ /** Dispatched when a chunk upload fails */
65
+ static readonly MEDIA_CHUNK_UPLOAD_FAILED = "mediaChunkUploadFailed";
66
+ /** Dispatched when the server returns an HTTP error for a chunk */
67
+ static readonly MEDIA_CHUNK_UPLOAD_HTTP_ERROR_RESPONSE = "mediaChunkUploadHttpErrorResponse";
68
+ /** Dispatched to provide the status of a chunk */
69
+ static readonly MEDIA_CHUNK_UPLOAD_STATUS = "mediaChunkUploadStatus";
70
+ /** Dispatched when maximum retry attempts are exceeded for a chunk */
71
+ static readonly MEDIA_CHUNK_UPLOAD_MAXRETRY_EXPIRE = "mediaChunkUploadMaxRetryExpire";
72
+ /** Dispatched when a chunk upload resumes */
73
+ static readonly MEDIA_CHUNK_UPLOAD_RESUME = "mediaChunkUploadResume";
74
+ /** Dispatched when the upload is paused */
75
+ static readonly UPLOAD_PAUSED = "uploadPaused";
76
+ /** Dispatched when the upload resumes after being paused */
77
+ static readonly UPLOAD_RESUMED = "uploadResumed";
78
+ /** Dispatched when the upload is cancelled */
79
+ static readonly UPLOAD_CANCELLED = "uploadCancelled";
80
+ /** Dispatched when the upload state changes */
81
+ static readonly UPLOAD_STATE_CHANGED = "uploadStateChanged";
82
+ /** Dispatched when the upload completes successfully */
83
+ static readonly DOWNLOAD_MEDIA_COMPLETE = "downloadMediaComplete";
84
+ /** Dispatched when the upload fails completely */
85
+ static readonly DOWNLOAD_MEDIA_FAILURE = "downloadMediaFailure";
86
+ /** Dispatched when the upload resumes from a saved state */
87
+ static readonly DOWNLOAD_MEDIA_RESUME = "downloadMediaResume";
88
+ static readonly FINALIZE_UPLOAD = "finalizeUpload";
89
+ static readonly FINALIZE_UPLOAD_FAILURE = "finalizeUploadFailure";
90
+ /** Dispatched when media metadata is saved successfully */
91
+ static readonly MEDIA_METADATA_SAVE_SUCCESS = "mediaMetadataSaveSuccess";
92
+ private constructor();
93
+ }
94
+
95
+ export { HttpFileUploaderEvents };
@@ -0,0 +1,8 @@
1
+ export { HttpFileUploaderEvents } from '../chunk-JDL3U4OX.js';
2
+ export { ChunkUploadHttpErrorResponseEvent, UploadChunkStartedEvent } from '../chunk-LD2DWZRJ.js';
3
+ export { FinalizeUploadEvent, FinalizeUploadFailureEvent, ResumeUploadEvent, UploadMediaCompleteEvent } from '../chunk-BNMI7DW3.js';
4
+ export { InitializeUploadFailureEvent, InitializeUploadStartedEvent, InitializeUploadSuccessEvent, InitializingUploadEvent } from '../chunk-3JTTZCSQ.js';
5
+ export { UploadCancelledEvent, UploadPausedEvent, UploadProgressEvent, UploadResumedEvent, UploadStateChangedEvent } from '../chunk-6225YMFE.js';
6
+ import '../chunk-7QVYU63E.js';
7
+ //# sourceMappingURL=index.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}