@uploadista/core 0.0.2
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/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-check.log +231 -0
- package/.turbo/turbo-format.log +5 -0
- package/LICENSE +21 -0
- package/README.md +1120 -0
- package/dist/chunk-CUT6urMc.cjs +1 -0
- package/dist/debounce-C2SeqcxD.js +2 -0
- package/dist/debounce-C2SeqcxD.js.map +1 -0
- package/dist/debounce-LZK7yS7Z.cjs +1 -0
- package/dist/errors/index.cjs +1 -0
- package/dist/errors/index.d.cts +3 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/uploadista-error.d.ts +209 -0
- package/dist/errors/uploadista-error.d.ts.map +1 -0
- package/dist/errors/uploadista-error.js +322 -0
- package/dist/errors-8i_aMxOE.js +1 -0
- package/dist/errors-CRm1FHHT.cjs +0 -0
- package/dist/flow/edge.d.ts +47 -0
- package/dist/flow/edge.d.ts.map +1 -0
- package/dist/flow/edge.js +40 -0
- package/dist/flow/event.d.ts +206 -0
- package/dist/flow/event.d.ts.map +1 -0
- package/dist/flow/event.js +53 -0
- package/dist/flow/flow-server.d.ts +223 -0
- package/dist/flow/flow-server.d.ts.map +1 -0
- package/dist/flow/flow-server.js +614 -0
- package/dist/flow/flow.d.ts +238 -0
- package/dist/flow/flow.d.ts.map +1 -0
- package/dist/flow/flow.js +629 -0
- package/dist/flow/index.cjs +1 -0
- package/dist/flow/index.d.cts +6 -0
- package/dist/flow/index.d.ts +24 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +24 -0
- package/dist/flow/node.d.ts +136 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +153 -0
- package/dist/flow/nodes/index.d.ts +8 -0
- package/dist/flow/nodes/index.d.ts.map +1 -0
- package/dist/flow/nodes/index.js +7 -0
- package/dist/flow/nodes/input-node.d.ts +78 -0
- package/dist/flow/nodes/input-node.d.ts.map +1 -0
- package/dist/flow/nodes/input-node.js +233 -0
- package/dist/flow/nodes/storage-node.d.ts +67 -0
- package/dist/flow/nodes/storage-node.d.ts.map +1 -0
- package/dist/flow/nodes/storage-node.js +94 -0
- package/dist/flow/nodes/streaming-input-node.d.ts +69 -0
- package/dist/flow/nodes/streaming-input-node.d.ts.map +1 -0
- package/dist/flow/nodes/streaming-input-node.js +156 -0
- package/dist/flow/nodes/transform-node.d.ts +85 -0
- package/dist/flow/nodes/transform-node.d.ts.map +1 -0
- package/dist/flow/nodes/transform-node.js +107 -0
- package/dist/flow/parallel-scheduler.d.ts +175 -0
- package/dist/flow/parallel-scheduler.d.ts.map +1 -0
- package/dist/flow/parallel-scheduler.js +193 -0
- package/dist/flow/plugins/credential-provider.d.ts +47 -0
- package/dist/flow/plugins/credential-provider.d.ts.map +1 -0
- package/dist/flow/plugins/credential-provider.js +24 -0
- package/dist/flow/plugins/image-ai-plugin.d.ts +61 -0
- package/dist/flow/plugins/image-ai-plugin.d.ts.map +1 -0
- package/dist/flow/plugins/image-ai-plugin.js +21 -0
- package/dist/flow/plugins/image-plugin.d.ts +52 -0
- package/dist/flow/plugins/image-plugin.d.ts.map +1 -0
- package/dist/flow/plugins/image-plugin.js +22 -0
- package/dist/flow/plugins/types/describe-image-node.d.ts +16 -0
- package/dist/flow/plugins/types/describe-image-node.d.ts.map +1 -0
- package/dist/flow/plugins/types/describe-image-node.js +9 -0
- package/dist/flow/plugins/types/index.d.ts +9 -0
- package/dist/flow/plugins/types/index.d.ts.map +1 -0
- package/dist/flow/plugins/types/index.js +8 -0
- package/dist/flow/plugins/types/optimize-node.d.ts +20 -0
- package/dist/flow/plugins/types/optimize-node.d.ts.map +1 -0
- package/dist/flow/plugins/types/optimize-node.js +11 -0
- package/dist/flow/plugins/types/remove-background-node.d.ts +16 -0
- package/dist/flow/plugins/types/remove-background-node.d.ts.map +1 -0
- package/dist/flow/plugins/types/remove-background-node.js +9 -0
- package/dist/flow/plugins/types/resize-node.d.ts +21 -0
- package/dist/flow/plugins/types/resize-node.d.ts.map +1 -0
- package/dist/flow/plugins/types/resize-node.js +16 -0
- package/dist/flow/plugins/zip-plugin.d.ts +62 -0
- package/dist/flow/plugins/zip-plugin.d.ts.map +1 -0
- package/dist/flow/plugins/zip-plugin.js +21 -0
- package/dist/flow/typed-flow.d.ts +90 -0
- package/dist/flow/typed-flow.d.ts.map +1 -0
- package/dist/flow/typed-flow.js +59 -0
- package/dist/flow/types/flow-file.d.ts +45 -0
- package/dist/flow/types/flow-file.d.ts.map +1 -0
- package/dist/flow/types/flow-file.js +27 -0
- package/dist/flow/types/flow-job.d.ts +118 -0
- package/dist/flow/types/flow-job.d.ts.map +1 -0
- package/dist/flow/types/flow-job.js +11 -0
- package/dist/flow/types/flow-types.d.ts +321 -0
- package/dist/flow/types/flow-types.d.ts.map +1 -0
- package/dist/flow/types/flow-types.js +52 -0
- package/dist/flow/types/index.d.ts +4 -0
- package/dist/flow/types/index.d.ts.map +1 -0
- package/dist/flow/types/index.js +3 -0
- package/dist/flow/types/run-args.d.ts +38 -0
- package/dist/flow/types/run-args.d.ts.map +1 -0
- package/dist/flow/types/run-args.js +30 -0
- package/dist/flow/types/type-validator.d.ts +26 -0
- package/dist/flow/types/type-validator.d.ts.map +1 -0
- package/dist/flow/types/type-validator.js +134 -0
- package/dist/flow/utils/resolve-upload-metadata.d.ts +11 -0
- package/dist/flow/utils/resolve-upload-metadata.d.ts.map +1 -0
- package/dist/flow/utils/resolve-upload-metadata.js +28 -0
- package/dist/flow-2zXnEiWL.cjs +1 -0
- package/dist/flow-CRaKy7Vj.js +2 -0
- package/dist/flow-CRaKy7Vj.js.map +1 -0
- package/dist/generate-id-Dm-Vboxq.d.ts +34 -0
- package/dist/generate-id-Dm-Vboxq.d.ts.map +1 -0
- package/dist/generate-id-LjJRLD6N.d.cts +34 -0
- package/dist/generate-id-LjJRLD6N.d.cts.map +1 -0
- package/dist/generate-id-xHp_Z7Cl.cjs +1 -0
- package/dist/generate-id-yohS1ZDk.js +2 -0
- package/dist/generate-id-yohS1ZDk.js.map +1 -0
- package/dist/index-BO8GZlbD.d.cts +1040 -0
- package/dist/index-BO8GZlbD.d.cts.map +1 -0
- package/dist/index-BoGG5KAY.d.ts +1 -0
- package/dist/index-BtBZHVmz.d.cts +1 -0
- package/dist/index-D-CoVpkZ.d.ts +1004 -0
- package/dist/index-D-CoVpkZ.d.ts.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/logger/logger.cjs +1 -0
- package/dist/logger/logger.d.cts +8 -0
- package/dist/logger/logger.d.cts.map +1 -0
- package/dist/logger/logger.d.ts +5 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +10 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/semaphore-0ZwjVpyF.js +2 -0
- package/dist/semaphore-0ZwjVpyF.js.map +1 -0
- package/dist/semaphore-BHprIjFI.d.cts +37 -0
- package/dist/semaphore-BHprIjFI.d.cts.map +1 -0
- package/dist/semaphore-DThupBkc.d.ts +37 -0
- package/dist/semaphore-DThupBkc.d.ts.map +1 -0
- package/dist/semaphore-DVrONiAV.cjs +1 -0
- package/dist/stream-limiter-CoWKv39w.js +2 -0
- package/dist/stream-limiter-CoWKv39w.js.map +1 -0
- package/dist/stream-limiter-JgOwmkMa.cjs +1 -0
- package/dist/streams/multi-stream.cjs +1 -0
- package/dist/streams/multi-stream.d.cts +91 -0
- package/dist/streams/multi-stream.d.cts.map +1 -0
- package/dist/streams/multi-stream.d.ts +86 -0
- package/dist/streams/multi-stream.d.ts.map +1 -0
- package/dist/streams/multi-stream.js +149 -0
- package/dist/streams/multi-stream.js.map +1 -0
- package/dist/streams/stream-limiter.cjs +1 -0
- package/dist/streams/stream-limiter.d.cts +36 -0
- package/dist/streams/stream-limiter.d.cts.map +1 -0
- package/dist/streams/stream-limiter.d.ts +27 -0
- package/dist/streams/stream-limiter.d.ts.map +1 -0
- package/dist/streams/stream-limiter.js +49 -0
- package/dist/streams/stream-splitter.cjs +1 -0
- package/dist/streams/stream-splitter.d.cts +68 -0
- package/dist/streams/stream-splitter.d.cts.map +1 -0
- package/dist/streams/stream-splitter.d.ts +51 -0
- package/dist/streams/stream-splitter.d.ts.map +1 -0
- package/dist/streams/stream-splitter.js +175 -0
- package/dist/streams/stream-splitter.js.map +1 -0
- package/dist/types/data-store-registry.d.ts +13 -0
- package/dist/types/data-store-registry.d.ts.map +1 -0
- package/dist/types/data-store-registry.js +4 -0
- package/dist/types/data-store.d.ts +316 -0
- package/dist/types/data-store.d.ts.map +1 -0
- package/dist/types/data-store.js +157 -0
- package/dist/types/event-broadcaster.d.ts +28 -0
- package/dist/types/event-broadcaster.d.ts.map +1 -0
- package/dist/types/event-broadcaster.js +6 -0
- package/dist/types/event-emitter.d.ts +378 -0
- package/dist/types/event-emitter.d.ts.map +1 -0
- package/dist/types/event-emitter.js +223 -0
- package/dist/types/index.cjs +1 -0
- package/dist/types/index.d.cts +6 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/input-file.d.ts +104 -0
- package/dist/types/input-file.d.ts.map +1 -0
- package/dist/types/input-file.js +27 -0
- package/dist/types/kv-store.d.ts +281 -0
- package/dist/types/kv-store.d.ts.map +1 -0
- package/dist/types/kv-store.js +234 -0
- package/dist/types/middleware.d.ts +17 -0
- package/dist/types/middleware.d.ts.map +1 -0
- package/dist/types/middleware.js +21 -0
- package/dist/types/upload-event.d.ts +105 -0
- package/dist/types/upload-event.d.ts.map +1 -0
- package/dist/types/upload-event.js +71 -0
- package/dist/types/upload-file.d.ts +136 -0
- package/dist/types/upload-file.d.ts.map +1 -0
- package/dist/types/upload-file.js +34 -0
- package/dist/types/websocket.d.ts +144 -0
- package/dist/types/websocket.d.ts.map +1 -0
- package/dist/types/websocket.js +40 -0
- package/dist/types-BT-cvi7T.cjs +1 -0
- package/dist/types-DhU2j-XF.js +2 -0
- package/dist/types-DhU2j-XF.js.map +1 -0
- package/dist/upload/convert-to-stream.d.ts +38 -0
- package/dist/upload/convert-to-stream.d.ts.map +1 -0
- package/dist/upload/convert-to-stream.js +43 -0
- package/dist/upload/convert-upload-to-flow-file.d.ts +14 -0
- package/dist/upload/convert-upload-to-flow-file.d.ts.map +1 -0
- package/dist/upload/convert-upload-to-flow-file.js +21 -0
- package/dist/upload/create-upload.d.ts +68 -0
- package/dist/upload/create-upload.d.ts.map +1 -0
- package/dist/upload/create-upload.js +157 -0
- package/dist/upload/index.cjs +1 -0
- package/dist/upload/index.d.cts +6 -0
- package/dist/upload/index.d.ts +4 -0
- package/dist/upload/index.d.ts.map +1 -0
- package/dist/upload/index.js +3 -0
- package/dist/upload/mime.d.ts +24 -0
- package/dist/upload/mime.d.ts.map +1 -0
- package/dist/upload/mime.js +351 -0
- package/dist/upload/upload-chunk.d.ts +58 -0
- package/dist/upload/upload-chunk.d.ts.map +1 -0
- package/dist/upload/upload-chunk.js +277 -0
- package/dist/upload/upload-server.d.ts +221 -0
- package/dist/upload/upload-server.d.ts.map +1 -0
- package/dist/upload/upload-server.js +181 -0
- package/dist/upload/upload-strategy-negotiator.d.ts +148 -0
- package/dist/upload/upload-strategy-negotiator.d.ts.map +1 -0
- package/dist/upload/upload-strategy-negotiator.js +217 -0
- package/dist/upload/upload-url.d.ts +68 -0
- package/dist/upload/upload-url.d.ts.map +1 -0
- package/dist/upload/upload-url.js +142 -0
- package/dist/upload/write-to-store.d.ts +77 -0
- package/dist/upload/write-to-store.d.ts.map +1 -0
- package/dist/upload/write-to-store.js +147 -0
- package/dist/upload-DLuICjpP.cjs +1 -0
- package/dist/upload-DaXO34dE.js +2 -0
- package/dist/upload-DaXO34dE.js.map +1 -0
- package/dist/uploadista-error-BB-Wdiz9.cjs +22 -0
- package/dist/uploadista-error-BVsVxqvz.js +23 -0
- package/dist/uploadista-error-BVsVxqvz.js.map +1 -0
- package/dist/uploadista-error-CwxYs4EB.d.ts +52 -0
- package/dist/uploadista-error-CwxYs4EB.d.ts.map +1 -0
- package/dist/uploadista-error-kKlhLRhY.d.cts +52 -0
- package/dist/uploadista-error-kKlhLRhY.d.cts.map +1 -0
- package/dist/utils/checksum.d.ts +22 -0
- package/dist/utils/checksum.d.ts.map +1 -0
- package/dist/utils/checksum.js +49 -0
- package/dist/utils/debounce.cjs +1 -0
- package/dist/utils/debounce.d.cts +38 -0
- package/dist/utils/debounce.d.cts.map +1 -0
- package/dist/utils/debounce.d.ts +36 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/debounce.js +73 -0
- package/dist/utils/generate-id.cjs +1 -0
- package/dist/utils/generate-id.d.cts +2 -0
- package/dist/utils/generate-id.d.ts +32 -0
- package/dist/utils/generate-id.d.ts.map +1 -0
- package/dist/utils/generate-id.js +23 -0
- package/dist/utils/md5.cjs +1 -0
- package/dist/utils/md5.d.cts +73 -0
- package/dist/utils/md5.d.cts.map +1 -0
- package/dist/utils/md5.d.ts +71 -0
- package/dist/utils/md5.d.ts.map +1 -0
- package/dist/utils/md5.js +417 -0
- package/dist/utils/md5.js.map +1 -0
- package/dist/utils/once.cjs +1 -0
- package/dist/utils/once.d.cts +25 -0
- package/dist/utils/once.d.cts.map +1 -0
- package/dist/utils/once.d.ts +21 -0
- package/dist/utils/once.d.ts.map +1 -0
- package/dist/utils/once.js +54 -0
- package/dist/utils/once.js.map +1 -0
- package/dist/utils/semaphore.cjs +1 -0
- package/dist/utils/semaphore.d.cts +3 -0
- package/dist/utils/semaphore.d.ts +78 -0
- package/dist/utils/semaphore.d.ts.map +1 -0
- package/dist/utils/semaphore.js +134 -0
- package/dist/utils/throttle.cjs +1 -0
- package/dist/utils/throttle.d.cts +24 -0
- package/dist/utils/throttle.d.cts.map +1 -0
- package/dist/utils/throttle.d.ts +18 -0
- package/dist/utils/throttle.d.ts.map +1 -0
- package/dist/utils/throttle.js +20 -0
- package/dist/utils/throttle.js.map +1 -0
- package/docs/PARALLEL_EXECUTION.md +206 -0
- package/docs/PARALLEL_EXECUTION_QUICKSTART.md +142 -0
- package/docs/PARALLEL_EXECUTION_REFACTOR.md +184 -0
- package/package.json +80 -0
- package/src/errors/__tests__/uploadista-error.test.ts +251 -0
- package/src/errors/index.ts +2 -0
- package/src/errors/uploadista-error.ts +394 -0
- package/src/flow/README.md +352 -0
- package/src/flow/edge.test.ts +146 -0
- package/src/flow/edge.ts +60 -0
- package/src/flow/event.ts +229 -0
- package/src/flow/flow-server.ts +1089 -0
- package/src/flow/flow.ts +1050 -0
- package/src/flow/index.ts +28 -0
- package/src/flow/node.ts +249 -0
- package/src/flow/nodes/index.ts +8 -0
- package/src/flow/nodes/input-node.ts +296 -0
- package/src/flow/nodes/storage-node.ts +128 -0
- package/src/flow/nodes/transform-node.ts +154 -0
- package/src/flow/parallel-scheduler.ts +259 -0
- package/src/flow/plugins/credential-provider.ts +48 -0
- package/src/flow/plugins/image-ai-plugin.ts +66 -0
- package/src/flow/plugins/image-plugin.ts +60 -0
- package/src/flow/plugins/types/describe-image-node.ts +16 -0
- package/src/flow/plugins/types/index.ts +9 -0
- package/src/flow/plugins/types/optimize-node.ts +18 -0
- package/src/flow/plugins/types/remove-background-node.ts +18 -0
- package/src/flow/plugins/types/resize-node.ts +26 -0
- package/src/flow/plugins/zip-plugin.ts +69 -0
- package/src/flow/typed-flow.ts +279 -0
- package/src/flow/types/flow-file.ts +51 -0
- package/src/flow/types/flow-job.ts +138 -0
- package/src/flow/types/flow-types.ts +353 -0
- package/src/flow/types/index.ts +6 -0
- package/src/flow/types/run-args.ts +40 -0
- package/src/flow/types/type-validator.ts +204 -0
- package/src/flow/utils/resolve-upload-metadata.ts +48 -0
- package/src/index.ts +5 -0
- package/src/logger/logger.ts +14 -0
- package/src/streams/stream-limiter.test.ts +150 -0
- package/src/streams/stream-limiter.ts +75 -0
- package/src/types/data-store.ts +427 -0
- package/src/types/event-broadcaster.ts +39 -0
- package/src/types/event-emitter.ts +349 -0
- package/src/types/index.ts +9 -0
- package/src/types/input-file.ts +107 -0
- package/src/types/kv-store.ts +375 -0
- package/src/types/middleware.ts +54 -0
- package/src/types/upload-event.ts +75 -0
- package/src/types/upload-file.ts +139 -0
- package/src/types/websocket.ts +65 -0
- package/src/upload/convert-to-stream.ts +48 -0
- package/src/upload/create-upload.ts +214 -0
- package/src/upload/index.ts +3 -0
- package/src/upload/mime.ts +436 -0
- package/src/upload/upload-chunk.ts +364 -0
- package/src/upload/upload-server.ts +390 -0
- package/src/upload/upload-strategy-negotiator.ts +316 -0
- package/src/upload/upload-url.ts +173 -0
- package/src/upload/write-to-store.ts +211 -0
- package/src/utils/checksum.ts +61 -0
- package/src/utils/debounce.test.ts +126 -0
- package/src/utils/debounce.ts +89 -0
- package/src/utils/generate-id.ts +35 -0
- package/src/utils/md5.ts +475 -0
- package/src/utils/once.test.ts +83 -0
- package/src/utils/once.ts +63 -0
- package/src/utils/throttle.test.ts +101 -0
- package/src/utils/throttle.ts +29 -0
- package/tsconfig.json +20 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsdown.config.ts +25 -0
- package/vitest.config.ts +15 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Stream } from "effect";
|
|
2
|
+
import { UploadistaError } from "../errors";
|
|
3
|
+
/**
|
|
4
|
+
* Converts a ReadableStream to an Effect Stream.
|
|
5
|
+
*
|
|
6
|
+
* This utility function wraps a ReadableStream in an Effect Stream, providing
|
|
7
|
+
* proper error handling and integration with the Effect ecosystem. It's used
|
|
8
|
+
* throughout the upload system to convert raw streams into Effect-compatible
|
|
9
|
+
* streams for processing.
|
|
10
|
+
*
|
|
11
|
+
* The function handles:
|
|
12
|
+
* - Stream conversion with proper error mapping
|
|
13
|
+
* - UploadistaError creation for stream errors
|
|
14
|
+
* - Integration with Effect Stream processing
|
|
15
|
+
*
|
|
16
|
+
* @param data - The ReadableStream to convert
|
|
17
|
+
* @returns Effect Stream that can be processed with Effect operations
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Convert a file stream to Effect Stream
|
|
22
|
+
* const fileStream = new ReadableStream(...);
|
|
23
|
+
* const effectStream = convertToStream(fileStream);
|
|
24
|
+
*
|
|
25
|
+
* // Process with Effect operations
|
|
26
|
+
* const processedStream = effectStream.pipe(
|
|
27
|
+
* Stream.map((chunk) => processChunk(chunk)),
|
|
28
|
+
* Stream.filter((chunk) => chunk.length > 0)
|
|
29
|
+
* );
|
|
30
|
+
*
|
|
31
|
+
* // Run the stream
|
|
32
|
+
* await Stream.runForEach(processedStream, (chunk) =>
|
|
33
|
+
* Effect.logInfo(`Processed chunk: ${chunk.length} bytes`)
|
|
34
|
+
* );
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function convertToStream<T>(data: ReadableStream<T>): Stream.Stream<T, UploadistaError, never>;
|
|
38
|
+
//# sourceMappingURL=convert-to-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-to-stream.d.ts","sourceRoot":"","sources":["../../src/upload/convert-to-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,4CAUzD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Stream } from "effect";
|
|
2
|
+
import { UploadistaError } from "../errors";
|
|
3
|
+
/**
|
|
4
|
+
* Converts a ReadableStream to an Effect Stream.
|
|
5
|
+
*
|
|
6
|
+
* This utility function wraps a ReadableStream in an Effect Stream, providing
|
|
7
|
+
* proper error handling and integration with the Effect ecosystem. It's used
|
|
8
|
+
* throughout the upload system to convert raw streams into Effect-compatible
|
|
9
|
+
* streams for processing.
|
|
10
|
+
*
|
|
11
|
+
* The function handles:
|
|
12
|
+
* - Stream conversion with proper error mapping
|
|
13
|
+
* - UploadistaError creation for stream errors
|
|
14
|
+
* - Integration with Effect Stream processing
|
|
15
|
+
*
|
|
16
|
+
* @param data - The ReadableStream to convert
|
|
17
|
+
* @returns Effect Stream that can be processed with Effect operations
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Convert a file stream to Effect Stream
|
|
22
|
+
* const fileStream = new ReadableStream(...);
|
|
23
|
+
* const effectStream = convertToStream(fileStream);
|
|
24
|
+
*
|
|
25
|
+
* // Process with Effect operations
|
|
26
|
+
* const processedStream = effectStream.pipe(
|
|
27
|
+
* Stream.map((chunk) => processChunk(chunk)),
|
|
28
|
+
* Stream.filter((chunk) => chunk.length > 0)
|
|
29
|
+
* );
|
|
30
|
+
*
|
|
31
|
+
* // Run the stream
|
|
32
|
+
* await Stream.runForEach(processedStream, (chunk) =>
|
|
33
|
+
* Effect.logInfo(`Processed chunk: ${chunk.length} bytes`)
|
|
34
|
+
* );
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function convertToStream(data) {
|
|
38
|
+
return Stream.fromReadableStream(() => data, (error) => new UploadistaError({
|
|
39
|
+
code: "UNKNOWN_ERROR",
|
|
40
|
+
status: 500,
|
|
41
|
+
body: String(error),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { UploadFile } from "../types";
|
|
3
|
+
import type { UploadServerShape } from "./upload-server";
|
|
4
|
+
export declare const uploadFileToFlowFile: (uploadFile: UploadFile, uploadServer: UploadServerShape) => Effect.Effect<{
|
|
5
|
+
path: string;
|
|
6
|
+
inputBytes: Uint8Array<ArrayBufferLike>;
|
|
7
|
+
metadata: {
|
|
8
|
+
mimeType: string;
|
|
9
|
+
size: number;
|
|
10
|
+
originalName: string;
|
|
11
|
+
extension: string;
|
|
12
|
+
};
|
|
13
|
+
}, import("..").UploadistaError, never>;
|
|
14
|
+
//# sourceMappingURL=convert-upload-to-flow-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-upload-to-flow-file.d.ts","sourceRoot":"","sources":["../../src/upload/convert-upload-to-flow-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,eAAO,MAAM,oBAAoB,GAC/B,YAAY,UAAU,EACtB,cAAc,iBAAiB;;;;;;;;;uCAqBhC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { detectMimeType } from "./mime";
|
|
3
|
+
// Helper to convert UploadFile to FlowFile
|
|
4
|
+
export const uploadFileToFlowFile = (uploadFile, uploadServer) => {
|
|
5
|
+
return Effect.gen(function* () {
|
|
6
|
+
const metadata = uploadFile.metadata || {};
|
|
7
|
+
const originalName = metadata.fileName || `upload-${uploadFile.id}`;
|
|
8
|
+
const mimeType = metadata.type || detectMimeType(new Uint8Array(0), originalName);
|
|
9
|
+
const fileBytes = yield* uploadServer.read(uploadFile.id);
|
|
10
|
+
return {
|
|
11
|
+
path: originalName,
|
|
12
|
+
inputBytes: fileBytes,
|
|
13
|
+
metadata: {
|
|
14
|
+
mimeType,
|
|
15
|
+
size: uploadFile.size || 0,
|
|
16
|
+
originalName,
|
|
17
|
+
extension: originalName.split(".").pop() || "",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type EventEmitter, type InputFile, type KvStore, type UploadEvent, type UploadFile, type UploadFileDataStoresShape } from "../types";
|
|
3
|
+
import type { GenerateIdShape } from "../utils/generate-id";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a new upload and initializes it in the storage system.
|
|
6
|
+
*
|
|
7
|
+
* This function handles the initial upload creation process including:
|
|
8
|
+
* - Generating a unique upload ID
|
|
9
|
+
* - Routing to appropriate data store based on storage ID
|
|
10
|
+
* - Creating the upload record in the data store
|
|
11
|
+
* - Storing upload metadata in KV store
|
|
12
|
+
* - Emitting upload started events
|
|
13
|
+
* - Parsing and validating metadata
|
|
14
|
+
*
|
|
15
|
+
* The function includes comprehensive observability with:
|
|
16
|
+
* - Effect tracing spans for performance monitoring
|
|
17
|
+
* - Metrics tracking for upload creation, file sizes, and success rates
|
|
18
|
+
* - Structured logging for debugging and monitoring
|
|
19
|
+
* - Error handling with proper UploadistaError types
|
|
20
|
+
*
|
|
21
|
+
* @param inputFile - Input file configuration including storage, size, type, etc.
|
|
22
|
+
* @param clientId - Client identifier (null for anonymous uploads)
|
|
23
|
+
* @param dataStoreService - Service for routing to appropriate data stores
|
|
24
|
+
* @param kvStore - KV store for upload metadata persistence
|
|
25
|
+
* @param eventEmitter - Event emitter for upload lifecycle events
|
|
26
|
+
* @param generateId - ID generator for creating unique upload identifiers
|
|
27
|
+
* @returns Effect that yields the created UploadFile
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // Create a new upload
|
|
32
|
+
* const inputFile: InputFile = {
|
|
33
|
+
* storageId: "s3-production",
|
|
34
|
+
* size: 1024000,
|
|
35
|
+
* type: "image/jpeg",
|
|
36
|
+
* fileName: "photo.jpg",
|
|
37
|
+
* metadata: JSON.stringify({ category: "photos" })
|
|
38
|
+
* };
|
|
39
|
+
*
|
|
40
|
+
* const createEffect = createUpload(
|
|
41
|
+
* inputFile,
|
|
42
|
+
* "client-123",
|
|
43
|
+
* {
|
|
44
|
+
* dataStoreService,
|
|
45
|
+
* kvStore,
|
|
46
|
+
* eventEmitter,
|
|
47
|
+
* generateId
|
|
48
|
+
* }
|
|
49
|
+
* );
|
|
50
|
+
*
|
|
51
|
+
* // Run with dependencies
|
|
52
|
+
* const upload = await Effect.runPromise(
|
|
53
|
+
* createEffect.pipe(
|
|
54
|
+
* Effect.provide(dataStoreLayer),
|
|
55
|
+
* Effect.provide(kvStoreLayer),
|
|
56
|
+
* Effect.provide(eventEmitterLayer),
|
|
57
|
+
* Effect.provide(generateIdLayer)
|
|
58
|
+
* )
|
|
59
|
+
* );
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare const createUpload: (inputFile: InputFile, clientId: string | null, { dataStoreService, kvStore, eventEmitter, generateId, }: {
|
|
63
|
+
dataStoreService: UploadFileDataStoresShape;
|
|
64
|
+
kvStore: KvStore<UploadFile>;
|
|
65
|
+
eventEmitter: EventEmitter<UploadEvent>;
|
|
66
|
+
generateId: GenerateIdShape;
|
|
67
|
+
}) => Effect.Effect<UploadFile, import("..").UploadistaError, never>;
|
|
68
|
+
//# sourceMappingURL=create-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-upload.d.ts","sourceRoot":"","sources":["../../src/upload/create-upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4B,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,yBAAyB,EAC/B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,eAAO,MAAM,YAAY,GACvB,WAAW,SAAS,EACpB,UAAU,MAAM,GAAG,IAAI,EACvB,0DAKG;IACD,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IACxC,UAAU,EAAE,eAAe,CAAC;CAC7B,mEAkIA,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Effect, Metric, MetricBoundaries } from "effect";
|
|
2
|
+
import { UploadEventType, } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a new upload and initializes it in the storage system.
|
|
5
|
+
*
|
|
6
|
+
* This function handles the initial upload creation process including:
|
|
7
|
+
* - Generating a unique upload ID
|
|
8
|
+
* - Routing to appropriate data store based on storage ID
|
|
9
|
+
* - Creating the upload record in the data store
|
|
10
|
+
* - Storing upload metadata in KV store
|
|
11
|
+
* - Emitting upload started events
|
|
12
|
+
* - Parsing and validating metadata
|
|
13
|
+
*
|
|
14
|
+
* The function includes comprehensive observability with:
|
|
15
|
+
* - Effect tracing spans for performance monitoring
|
|
16
|
+
* - Metrics tracking for upload creation, file sizes, and success rates
|
|
17
|
+
* - Structured logging for debugging and monitoring
|
|
18
|
+
* - Error handling with proper UploadistaError types
|
|
19
|
+
*
|
|
20
|
+
* @param inputFile - Input file configuration including storage, size, type, etc.
|
|
21
|
+
* @param clientId - Client identifier (null for anonymous uploads)
|
|
22
|
+
* @param dataStoreService - Service for routing to appropriate data stores
|
|
23
|
+
* @param kvStore - KV store for upload metadata persistence
|
|
24
|
+
* @param eventEmitter - Event emitter for upload lifecycle events
|
|
25
|
+
* @param generateId - ID generator for creating unique upload identifiers
|
|
26
|
+
* @returns Effect that yields the created UploadFile
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // Create a new upload
|
|
31
|
+
* const inputFile: InputFile = {
|
|
32
|
+
* storageId: "s3-production",
|
|
33
|
+
* size: 1024000,
|
|
34
|
+
* type: "image/jpeg",
|
|
35
|
+
* fileName: "photo.jpg",
|
|
36
|
+
* metadata: JSON.stringify({ category: "photos" })
|
|
37
|
+
* };
|
|
38
|
+
*
|
|
39
|
+
* const createEffect = createUpload(
|
|
40
|
+
* inputFile,
|
|
41
|
+
* "client-123",
|
|
42
|
+
* {
|
|
43
|
+
* dataStoreService,
|
|
44
|
+
* kvStore,
|
|
45
|
+
* eventEmitter,
|
|
46
|
+
* generateId
|
|
47
|
+
* }
|
|
48
|
+
* );
|
|
49
|
+
*
|
|
50
|
+
* // Run with dependencies
|
|
51
|
+
* const upload = await Effect.runPromise(
|
|
52
|
+
* createEffect.pipe(
|
|
53
|
+
* Effect.provide(dataStoreLayer),
|
|
54
|
+
* Effect.provide(kvStoreLayer),
|
|
55
|
+
* Effect.provide(eventEmitterLayer),
|
|
56
|
+
* Effect.provide(generateIdLayer)
|
|
57
|
+
* )
|
|
58
|
+
* );
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export const createUpload = (inputFile, clientId, { dataStoreService, kvStore, eventEmitter, generateId, }) => Effect.gen(function* () {
|
|
62
|
+
// Get datastore using Effect
|
|
63
|
+
const dataStore = yield* dataStoreService.getDataStore(inputFile.storageId, clientId);
|
|
64
|
+
const id = yield* generateId.generateId();
|
|
65
|
+
const { size, type, fileName, lastModified, metadata, flow } = inputFile;
|
|
66
|
+
let parsedMetadata = {};
|
|
67
|
+
if (metadata) {
|
|
68
|
+
try {
|
|
69
|
+
parsedMetadata = JSON.parse(metadata);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
parsedMetadata = {};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const metadataObject = {
|
|
76
|
+
...parsedMetadata,
|
|
77
|
+
type,
|
|
78
|
+
fileName: fileName ?? "",
|
|
79
|
+
};
|
|
80
|
+
if (lastModified) {
|
|
81
|
+
metadataObject.lastModified = lastModified.toString();
|
|
82
|
+
}
|
|
83
|
+
const file = {
|
|
84
|
+
id,
|
|
85
|
+
size,
|
|
86
|
+
metadata: metadataObject,
|
|
87
|
+
offset: 0,
|
|
88
|
+
creationDate: new Date().toISOString(),
|
|
89
|
+
storage: {
|
|
90
|
+
id: inputFile.storageId,
|
|
91
|
+
type,
|
|
92
|
+
path: "",
|
|
93
|
+
bucket: dataStore.bucket,
|
|
94
|
+
},
|
|
95
|
+
flow,
|
|
96
|
+
};
|
|
97
|
+
// Create file using Effect
|
|
98
|
+
const fileCreated = yield* dataStore.create(file);
|
|
99
|
+
// Store in KV store
|
|
100
|
+
yield* kvStore.set(id, fileCreated);
|
|
101
|
+
// Emit event
|
|
102
|
+
yield* eventEmitter.emit(id, {
|
|
103
|
+
type: UploadEventType.UPLOAD_STARTED,
|
|
104
|
+
data: fileCreated,
|
|
105
|
+
flow: fileCreated.flow,
|
|
106
|
+
});
|
|
107
|
+
return fileCreated;
|
|
108
|
+
}).pipe(
|
|
109
|
+
// Add tracing span for the entire create operation
|
|
110
|
+
Effect.withSpan("upload-create", {
|
|
111
|
+
attributes: {
|
|
112
|
+
"upload.file_name": inputFile.fileName ?? "unknown",
|
|
113
|
+
"upload.file_size": inputFile.size?.toString() ?? "0",
|
|
114
|
+
"upload.storage_id": inputFile.storageId,
|
|
115
|
+
"upload.mime_type": inputFile.type,
|
|
116
|
+
"upload.has_flow": inputFile.flow ? "true" : "false",
|
|
117
|
+
},
|
|
118
|
+
}),
|
|
119
|
+
// Track upload creation metrics
|
|
120
|
+
Effect.tap((file) => Effect.gen(function* () {
|
|
121
|
+
// Increment upload created counter
|
|
122
|
+
yield* Metric.increment(Metric.counter("upload_created_total", {
|
|
123
|
+
description: "Total number of uploads created",
|
|
124
|
+
}));
|
|
125
|
+
// Record file size
|
|
126
|
+
if (file.size) {
|
|
127
|
+
const fileSizeHistogram = Metric.histogram("upload_file_size_bytes", MetricBoundaries.exponential({
|
|
128
|
+
start: 1024,
|
|
129
|
+
factor: 2,
|
|
130
|
+
count: 25,
|
|
131
|
+
}));
|
|
132
|
+
yield* Metric.update(fileSizeHistogram, file.size);
|
|
133
|
+
}
|
|
134
|
+
// Track active uploads gauge
|
|
135
|
+
const activeUploadsGauge = Metric.gauge("active_uploads");
|
|
136
|
+
yield* Metric.increment(activeUploadsGauge);
|
|
137
|
+
})),
|
|
138
|
+
// Add structured logging
|
|
139
|
+
Effect.tap((file) => Effect.logInfo("Upload created").pipe(Effect.annotateLogs({
|
|
140
|
+
"upload.id": file.id,
|
|
141
|
+
"upload.file_name": inputFile.fileName ?? "unknown",
|
|
142
|
+
"upload.file_size": inputFile.size?.toString() ?? "0",
|
|
143
|
+
"upload.storage_id": inputFile.storageId,
|
|
144
|
+
}))),
|
|
145
|
+
// Handle errors with logging and metrics
|
|
146
|
+
Effect.tapError((error) => Effect.gen(function* () {
|
|
147
|
+
// Log error
|
|
148
|
+
yield* Effect.logError("Upload creation failed").pipe(Effect.annotateLogs({
|
|
149
|
+
"upload.file_name": inputFile.fileName ?? "unknown",
|
|
150
|
+
"upload.storage_id": inputFile.storageId,
|
|
151
|
+
error: String(error),
|
|
152
|
+
}));
|
|
153
|
+
// Track failed upload metric
|
|
154
|
+
yield* Metric.increment(Metric.counter("upload_failed_total", {
|
|
155
|
+
description: "Total number of uploads that failed",
|
|
156
|
+
}));
|
|
157
|
+
})));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`../uploadista-error-BB-Wdiz9.cjs`),require(`../errors-CRm1FHHT.cjs`),require(`../types-BT-cvi7T.cjs`);const e=require(`../upload-DLuICjpP.cjs`);require(`../generate-id-xHp_Z7Cl.cjs`),require(`../stream-limiter-JgOwmkMa.cjs`),exports.UploadServer=e.UploadServer,exports.UploadStrategyNegotiator=e.UploadStrategyNegotiator,exports.createUploadServer=e.createUploadServer,exports.detectMimeType=e.detectMimeType,exports.uploadServer=e.uploadServer;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import "../uploadista-error-kKlhLRhY.cjs";
|
|
2
|
+
import "../index-BtBZHVmz.cjs";
|
|
3
|
+
import { NegotiatedStrategy, UploadServer, UploadServerOptions, UploadServerShape, UploadStrategyNegotiator, UploadStrategyOptions, createUploadServer, detectMimeType, uploadServer } from "../index-BO8GZlbD.cjs";
|
|
4
|
+
import "../generate-id-LjJRLD6N.cjs";
|
|
5
|
+
import "../semaphore-BHprIjFI.cjs";
|
|
6
|
+
export { NegotiatedStrategy, UploadServer, UploadServerOptions, UploadServerShape, UploadStrategyNegotiator, UploadStrategyOptions, createUploadServer, detectMimeType, uploadServer };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upload/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect MIME type from buffer using magic bytes (file signatures).
|
|
3
|
+
* Supports a wide range of common file types including images, videos, audio, documents, and archives.
|
|
4
|
+
*
|
|
5
|
+
* @param buffer - File content as Uint8Array
|
|
6
|
+
* @param filename - Optional filename for extension-based fallback
|
|
7
|
+
* @returns Detected MIME type or "application/octet-stream" if unknown
|
|
8
|
+
*/
|
|
9
|
+
export declare const detectMimeType: (buffer: Uint8Array, filename?: string) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Compare two MIME types with lenient matching.
|
|
12
|
+
* Matches on major type (e.g., "image/*") to allow for minor variations.
|
|
13
|
+
*
|
|
14
|
+
* @param declared - MIME type provided by client
|
|
15
|
+
* @param detected - MIME type detected from file content
|
|
16
|
+
* @returns true if MIME types are compatible
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* compareMimeTypes("image/png", "image/apng") // true
|
|
20
|
+
* compareMimeTypes("image/jpeg", "image/png") // true (both images)
|
|
21
|
+
* compareMimeTypes("image/png", "application/pdf") // false
|
|
22
|
+
*/
|
|
23
|
+
export declare function compareMimeTypes(declared: string, detected: string): boolean;
|
|
24
|
+
//# sourceMappingURL=mime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/upload/mime.ts"],"names":[],"mappings":"AA2BA;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GACzB,QAAQ,UAAU,EAClB,WAAW,MAAM,KAChB,MAkXF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAY5E"}
|