@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,378 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import type { UploadistaError } from "../errors";
|
|
3
|
+
import type { FlowEvent } from "../flow/event";
|
|
4
|
+
import type { WebSocketConnection } from "./websocket";
|
|
5
|
+
/**
|
|
6
|
+
* Base event emitter interface for raw string message broadcasting.
|
|
7
|
+
*
|
|
8
|
+
* This is the low-level interface that event broadcasting implementations
|
|
9
|
+
* (WebSocket, Server-Sent Events, etc.) implement. It emits raw string messages
|
|
10
|
+
* without type safety or serialization.
|
|
11
|
+
*
|
|
12
|
+
* @property subscribe - Registers a WebSocket connection to receive events for a key
|
|
13
|
+
* @property unsubscribe - Removes subscription for a key
|
|
14
|
+
* @property emit - Broadcasts a string message to all subscribers of a key
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Implement BaseEventEmitter with WebSocket broadcast
|
|
19
|
+
* const websocketEmitter: BaseEventEmitter = {
|
|
20
|
+
* subscribe: (key, connection) => Effect.sync(() => {
|
|
21
|
+
* connections.set(key, [...(connections.get(key) || []), connection]);
|
|
22
|
+
* }),
|
|
23
|
+
*
|
|
24
|
+
* unsubscribe: (key) => Effect.sync(() => {
|
|
25
|
+
* connections.delete(key);
|
|
26
|
+
* }),
|
|
27
|
+
*
|
|
28
|
+
* emit: (key, event) => Effect.sync(() => {
|
|
29
|
+
* const subs = connections.get(key) || [];
|
|
30
|
+
* subs.forEach(conn => conn.send(event));
|
|
31
|
+
* })
|
|
32
|
+
* };
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export interface BaseEventEmitter {
|
|
36
|
+
readonly subscribe: (key: string, connection: WebSocketConnection) => Effect.Effect<void, UploadistaError>;
|
|
37
|
+
readonly unsubscribe: (key: string) => Effect.Effect<void, UploadistaError>;
|
|
38
|
+
readonly emit: (key: string, event: string) => Effect.Effect<void, UploadistaError>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Type-safe event emitter interface with automatic serialization.
|
|
42
|
+
*
|
|
43
|
+
* This wraps a BaseEventEmitter and handles event serialization to JSON messages,
|
|
44
|
+
* providing type safety for events and ensuring consistent message format.
|
|
45
|
+
*
|
|
46
|
+
* @template TEvent - The type of events emitted by this emitter
|
|
47
|
+
*
|
|
48
|
+
* @property subscribe - Registers a WebSocket connection to receive typed events
|
|
49
|
+
* @property unsubscribe - Removes subscription
|
|
50
|
+
* @property emit - Serializes and broadcasts a typed event
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // Use a typed event emitter
|
|
55
|
+
* const uploadEmitter: EventEmitter<UploadEvent> = new TypedEventEmitter(
|
|
56
|
+
* baseEmitter,
|
|
57
|
+
* (event) => JSON.stringify({ type: 'upload', payload: event })
|
|
58
|
+
* );
|
|
59
|
+
*
|
|
60
|
+
* // Emit type-safe events
|
|
61
|
+
* const program = Effect.gen(function* () {
|
|
62
|
+
* const event: UploadEvent = {
|
|
63
|
+
* uploadId: "upload123",
|
|
64
|
+
* type: "progress",
|
|
65
|
+
* offset: 1024,
|
|
66
|
+
* size: 2048
|
|
67
|
+
* };
|
|
68
|
+
*
|
|
69
|
+
* // Automatic serialization
|
|
70
|
+
* yield* uploadEmitter.emit("upload123", event);
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export type EventEmitter<TEvent> = {
|
|
75
|
+
readonly subscribe: (key: string, connection: WebSocketConnection) => Effect.Effect<void, UploadistaError>;
|
|
76
|
+
readonly unsubscribe: (key: string) => Effect.Effect<void, UploadistaError>;
|
|
77
|
+
readonly emit: (key: string, event: TEvent) => Effect.Effect<void, UploadistaError>;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Typed wrapper class that adds event serialization to a BaseEventEmitter.
|
|
81
|
+
*
|
|
82
|
+
* This class implements the EventEmitter interface by wrapping a BaseEventEmitter
|
|
83
|
+
* and handling serialization for a specific event type. It converts typed events
|
|
84
|
+
* to JSON message strings before broadcasting.
|
|
85
|
+
*
|
|
86
|
+
* @template TEvent - The type of events to emit
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* // Create a typed emitter for UploadEvent
|
|
91
|
+
* const uploadEmitter = new TypedEventEmitter<UploadEvent>(
|
|
92
|
+
* baseEmitter,
|
|
93
|
+
* (event) => JSON.stringify({
|
|
94
|
+
* type: "upload_event",
|
|
95
|
+
* payload: event,
|
|
96
|
+
* timestamp: new Date().toISOString()
|
|
97
|
+
* })
|
|
98
|
+
* );
|
|
99
|
+
*
|
|
100
|
+
* // Use the emitter
|
|
101
|
+
* const effect = Effect.gen(function* () {
|
|
102
|
+
* // Subscribe a WebSocket connection
|
|
103
|
+
* yield* uploadEmitter.subscribe("upload123", websocket);
|
|
104
|
+
*
|
|
105
|
+
* // Emit an event (automatically serialized)
|
|
106
|
+
* yield* uploadEmitter.emit("upload123", {
|
|
107
|
+
* uploadId: "upload123",
|
|
108
|
+
* type: "completed",
|
|
109
|
+
* offset: 2048,
|
|
110
|
+
* size: 2048
|
|
111
|
+
* });
|
|
112
|
+
*
|
|
113
|
+
* // Unsubscribe when done
|
|
114
|
+
* yield* uploadEmitter.unsubscribe("upload123");
|
|
115
|
+
* });
|
|
116
|
+
*
|
|
117
|
+
* // Custom message format
|
|
118
|
+
* const customEmitter = new TypedEventEmitter<MyEvent>(
|
|
119
|
+
* baseEmitter,
|
|
120
|
+
* (event) => `EVENT:${event.type}:${JSON.stringify(event.data)}`
|
|
121
|
+
* );
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare class TypedEventEmitter<TEvent> implements EventEmitter<TEvent> {
|
|
125
|
+
private baseEmitter;
|
|
126
|
+
private eventToMessage;
|
|
127
|
+
constructor(baseEmitter: BaseEventEmitter, eventToMessage: (event: TEvent) => string);
|
|
128
|
+
subscribe: (key: string, connection: WebSocketConnection) => Effect.Effect<void, UploadistaError>;
|
|
129
|
+
unsubscribe: (key: string) => Effect.Effect<void, UploadistaError>;
|
|
130
|
+
emit: (key: string, event: TEvent) => Effect.Effect<void, UploadistaError>;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Default event-to-message serialization helper.
|
|
134
|
+
*
|
|
135
|
+
* Creates a standardized JSON message format with type, payload, and timestamp.
|
|
136
|
+
* This is the recommended way to serialize events for WebSocket transmission.
|
|
137
|
+
*
|
|
138
|
+
* @param messageType - The message type identifier ("upload_event" or "flow_event")
|
|
139
|
+
* @returns An object with an eventToMessage function
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* // Create emitter with standard serialization
|
|
144
|
+
* const emitter = new TypedEventEmitter<UploadEvent>(
|
|
145
|
+
* baseEmitter,
|
|
146
|
+
* eventToMessageSerializer("upload_event").eventToMessage
|
|
147
|
+
* );
|
|
148
|
+
*
|
|
149
|
+
* // Messages will be formatted as:
|
|
150
|
+
* // {
|
|
151
|
+
* // "type": "upload_event",
|
|
152
|
+
* // "payload": { ...event data... },
|
|
153
|
+
* // "timestamp": "2024-01-15T10:30:00.000Z"
|
|
154
|
+
* // }
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export declare const eventToMessageSerializer: (messageType: "upload_event" | "flow_event") => {
|
|
158
|
+
eventToMessage: <T>(event: T) => string;
|
|
159
|
+
};
|
|
160
|
+
declare const BaseEventEmitterService_base: Context.TagClass<BaseEventEmitterService, "BaseEventEmitter", BaseEventEmitter>;
|
|
161
|
+
/**
|
|
162
|
+
* Effect-TS context tag for the base untyped event emitter.
|
|
163
|
+
*
|
|
164
|
+
* This is the low-level emitter that broadcasting implementations provide.
|
|
165
|
+
* Most application code should use typed emitters like UploadEventEmitter instead.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* // Provide a base emitter implementation
|
|
170
|
+
* const baseEmitterLayer = Layer.succeed(BaseEventEmitterService, websocketEmitter);
|
|
171
|
+
*
|
|
172
|
+
* // Use in an Effect
|
|
173
|
+
* const effect = Effect.gen(function* () {
|
|
174
|
+
* const baseEmitter = yield* BaseEventEmitterService;
|
|
175
|
+
* yield* baseEmitter.emit("channel1", "raw message");
|
|
176
|
+
* });
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export declare class BaseEventEmitterService extends BaseEventEmitterService_base {
|
|
180
|
+
}
|
|
181
|
+
declare const UploadEventEmitter_base: Context.TagClass<UploadEventEmitter, "UploadEventEmitter", EventEmitter<{
|
|
182
|
+
type: import("./upload-event").UploadEventType.UPLOAD_STARTED | import("./upload-event").UploadEventType.UPLOAD_COMPLETE;
|
|
183
|
+
data: {
|
|
184
|
+
id: string;
|
|
185
|
+
offset: number;
|
|
186
|
+
storage: {
|
|
187
|
+
id: string;
|
|
188
|
+
type: string;
|
|
189
|
+
path?: string | undefined;
|
|
190
|
+
uploadId?: string | undefined;
|
|
191
|
+
bucket?: string | undefined;
|
|
192
|
+
};
|
|
193
|
+
size?: number | undefined;
|
|
194
|
+
metadata?: Record<string, string | number | boolean> | undefined;
|
|
195
|
+
creationDate?: string | undefined;
|
|
196
|
+
url?: string | undefined;
|
|
197
|
+
sizeIsDeferred?: boolean | undefined;
|
|
198
|
+
checksum?: string | undefined;
|
|
199
|
+
checksumAlgorithm?: string | undefined;
|
|
200
|
+
flow?: {
|
|
201
|
+
flowId: string;
|
|
202
|
+
nodeId: string;
|
|
203
|
+
jobId: string;
|
|
204
|
+
} | undefined;
|
|
205
|
+
};
|
|
206
|
+
flow?: {
|
|
207
|
+
flowId: string;
|
|
208
|
+
nodeId: string;
|
|
209
|
+
jobId: string;
|
|
210
|
+
} | undefined;
|
|
211
|
+
} | {
|
|
212
|
+
type: import("./upload-event").UploadEventType.UPLOAD_PROGRESS;
|
|
213
|
+
data: {
|
|
214
|
+
id: string;
|
|
215
|
+
progress: number;
|
|
216
|
+
total: number;
|
|
217
|
+
};
|
|
218
|
+
flow?: {
|
|
219
|
+
flowId: string;
|
|
220
|
+
nodeId: string;
|
|
221
|
+
jobId: string;
|
|
222
|
+
} | undefined;
|
|
223
|
+
} | {
|
|
224
|
+
type: import("./upload-event").UploadEventType.UPLOAD_FAILED;
|
|
225
|
+
data: {
|
|
226
|
+
id: string;
|
|
227
|
+
error: string;
|
|
228
|
+
};
|
|
229
|
+
flow?: {
|
|
230
|
+
flowId: string;
|
|
231
|
+
nodeId: string;
|
|
232
|
+
jobId: string;
|
|
233
|
+
} | undefined;
|
|
234
|
+
} | {
|
|
235
|
+
type: import("./upload-event").UploadEventType.UPLOAD_VALIDATION_SUCCESS;
|
|
236
|
+
data: {
|
|
237
|
+
id: string;
|
|
238
|
+
validationType: "checksum" | "mimetype";
|
|
239
|
+
algorithm?: string | undefined;
|
|
240
|
+
};
|
|
241
|
+
flow?: {
|
|
242
|
+
flowId: string;
|
|
243
|
+
nodeId: string;
|
|
244
|
+
jobId: string;
|
|
245
|
+
} | undefined;
|
|
246
|
+
} | {
|
|
247
|
+
type: import("./upload-event").UploadEventType.UPLOAD_VALIDATION_FAILED;
|
|
248
|
+
data: {
|
|
249
|
+
id: string;
|
|
250
|
+
reason: string;
|
|
251
|
+
expected: string;
|
|
252
|
+
actual: string;
|
|
253
|
+
};
|
|
254
|
+
flow?: {
|
|
255
|
+
flowId: string;
|
|
256
|
+
nodeId: string;
|
|
257
|
+
jobId: string;
|
|
258
|
+
} | undefined;
|
|
259
|
+
} | {
|
|
260
|
+
type: import("./upload-event").UploadEventType.UPLOAD_VALIDATION_WARNING;
|
|
261
|
+
data: {
|
|
262
|
+
id: string;
|
|
263
|
+
message: string;
|
|
264
|
+
};
|
|
265
|
+
flow?: {
|
|
266
|
+
flowId: string;
|
|
267
|
+
nodeId: string;
|
|
268
|
+
jobId: string;
|
|
269
|
+
} | undefined;
|
|
270
|
+
}>>;
|
|
271
|
+
/**
|
|
272
|
+
* Effect-TS context tag for the UploadEvent typed emitter.
|
|
273
|
+
*
|
|
274
|
+
* This provides type-safe event emission for upload progress and lifecycle events.
|
|
275
|
+
* It's the primary way to broadcast upload events to connected clients.
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* const uploadEffect = Effect.gen(function* () {
|
|
280
|
+
* const emitter = yield* UploadEventEmitter;
|
|
281
|
+
*
|
|
282
|
+
* // Subscribe a client to upload events
|
|
283
|
+
* yield* emitter.subscribe("upload123", websocketConnection);
|
|
284
|
+
*
|
|
285
|
+
* // Emit progress event
|
|
286
|
+
* yield* emitter.emit("upload123", {
|
|
287
|
+
* uploadId: "upload123",
|
|
288
|
+
* type: "progress",
|
|
289
|
+
* offset: 512000,
|
|
290
|
+
* size: 1024000
|
|
291
|
+
* });
|
|
292
|
+
*
|
|
293
|
+
* // Emit completion event
|
|
294
|
+
* yield* emitter.emit("upload123", {
|
|
295
|
+
* uploadId: "upload123",
|
|
296
|
+
* type: "completed",
|
|
297
|
+
* offset: 1024000,
|
|
298
|
+
* size: 1024000
|
|
299
|
+
* });
|
|
300
|
+
* });
|
|
301
|
+
* ```
|
|
302
|
+
*/
|
|
303
|
+
export declare class UploadEventEmitter extends UploadEventEmitter_base {
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Effect Layer that creates the UploadEventEmitter from a BaseEventEmitter.
|
|
307
|
+
*
|
|
308
|
+
* This layer automatically wires up JSON serialization for UploadEvent objects
|
|
309
|
+
* with the standard "upload_event" message format.
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* ```typescript
|
|
313
|
+
* const program = Effect.gen(function* () {
|
|
314
|
+
* const emitter = yield* UploadEventEmitter;
|
|
315
|
+
* // Use the emitter...
|
|
316
|
+
* }).pipe(
|
|
317
|
+
* Effect.provide(uploadEventEmitter),
|
|
318
|
+
* Effect.provide(baseEmitterLayer)
|
|
319
|
+
* );
|
|
320
|
+
* ```
|
|
321
|
+
*/
|
|
322
|
+
export declare const uploadEventEmitter: Layer.Layer<UploadEventEmitter, never, BaseEventEmitterService>;
|
|
323
|
+
declare const FlowEventEmitter_base: Context.TagClass<FlowEventEmitter, "FlowEventEmitter", EventEmitter<FlowEvent>>;
|
|
324
|
+
/**
|
|
325
|
+
* Effect-TS context tag for the FlowEvent typed emitter.
|
|
326
|
+
*
|
|
327
|
+
* This provides type-safe event emission for flow processing lifecycle events.
|
|
328
|
+
* It's used to broadcast flow execution progress, node completion, and errors.
|
|
329
|
+
*
|
|
330
|
+
* @example
|
|
331
|
+
* ```typescript
|
|
332
|
+
* const flowEffect = Effect.gen(function* () {
|
|
333
|
+
* const emitter = yield* FlowEventEmitter;
|
|
334
|
+
*
|
|
335
|
+
* // Subscribe a client to flow job events
|
|
336
|
+
* yield* emitter.subscribe("job123", websocketConnection);
|
|
337
|
+
*
|
|
338
|
+
* // Emit node start event
|
|
339
|
+
* yield* emitter.emit("job123", {
|
|
340
|
+
* jobId: "job123",
|
|
341
|
+
* eventType: "NodeStart",
|
|
342
|
+
* flowId: "flow_resize",
|
|
343
|
+
* nodeId: "resize_1"
|
|
344
|
+
* });
|
|
345
|
+
*
|
|
346
|
+
* // Emit node completion event
|
|
347
|
+
* yield* emitter.emit("job123", {
|
|
348
|
+
* jobId: "job123",
|
|
349
|
+
* eventType: "NodeEnd",
|
|
350
|
+
* flowId: "flow_resize",
|
|
351
|
+
* nodeId: "resize_1",
|
|
352
|
+
* result: { width: 800, height: 600 }
|
|
353
|
+
* });
|
|
354
|
+
* });
|
|
355
|
+
* ```
|
|
356
|
+
*/
|
|
357
|
+
export declare class FlowEventEmitter extends FlowEventEmitter_base {
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Effect Layer that creates the FlowEventEmitter from a BaseEventEmitter.
|
|
361
|
+
*
|
|
362
|
+
* This layer automatically wires up JSON serialization for FlowEvent objects
|
|
363
|
+
* with the standard "flow_event" message format.
|
|
364
|
+
*
|
|
365
|
+
* @example
|
|
366
|
+
* ```typescript
|
|
367
|
+
* const program = Effect.gen(function* () {
|
|
368
|
+
* const emitter = yield* FlowEventEmitter;
|
|
369
|
+
* // Use the emitter...
|
|
370
|
+
* }).pipe(
|
|
371
|
+
* Effect.provide(flowEventEmitter),
|
|
372
|
+
* Effect.provide(baseEmitterLayer)
|
|
373
|
+
* );
|
|
374
|
+
* ```
|
|
375
|
+
*/
|
|
376
|
+
export declare const flowEventEmitter: Layer.Layer<FlowEventEmitter, never, BaseEventEmitterService>;
|
|
377
|
+
export {};
|
|
378
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/types/event-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Typed wrapper class that adds event serialization to a BaseEventEmitter.
|
|
4
|
+
*
|
|
5
|
+
* This class implements the EventEmitter interface by wrapping a BaseEventEmitter
|
|
6
|
+
* and handling serialization for a specific event type. It converts typed events
|
|
7
|
+
* to JSON message strings before broadcasting.
|
|
8
|
+
*
|
|
9
|
+
* @template TEvent - The type of events to emit
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Create a typed emitter for UploadEvent
|
|
14
|
+
* const uploadEmitter = new TypedEventEmitter<UploadEvent>(
|
|
15
|
+
* baseEmitter,
|
|
16
|
+
* (event) => JSON.stringify({
|
|
17
|
+
* type: "upload_event",
|
|
18
|
+
* payload: event,
|
|
19
|
+
* timestamp: new Date().toISOString()
|
|
20
|
+
* })
|
|
21
|
+
* );
|
|
22
|
+
*
|
|
23
|
+
* // Use the emitter
|
|
24
|
+
* const effect = Effect.gen(function* () {
|
|
25
|
+
* // Subscribe a WebSocket connection
|
|
26
|
+
* yield* uploadEmitter.subscribe("upload123", websocket);
|
|
27
|
+
*
|
|
28
|
+
* // Emit an event (automatically serialized)
|
|
29
|
+
* yield* uploadEmitter.emit("upload123", {
|
|
30
|
+
* uploadId: "upload123",
|
|
31
|
+
* type: "completed",
|
|
32
|
+
* offset: 2048,
|
|
33
|
+
* size: 2048
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Unsubscribe when done
|
|
37
|
+
* yield* uploadEmitter.unsubscribe("upload123");
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Custom message format
|
|
41
|
+
* const customEmitter = new TypedEventEmitter<MyEvent>(
|
|
42
|
+
* baseEmitter,
|
|
43
|
+
* (event) => `EVENT:${event.type}:${JSON.stringify(event.data)}`
|
|
44
|
+
* );
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class TypedEventEmitter {
|
|
48
|
+
baseEmitter;
|
|
49
|
+
eventToMessage;
|
|
50
|
+
constructor(baseEmitter, eventToMessage) {
|
|
51
|
+
this.baseEmitter = baseEmitter;
|
|
52
|
+
this.eventToMessage = eventToMessage;
|
|
53
|
+
}
|
|
54
|
+
subscribe = (key, connection) => this.baseEmitter.subscribe(key, connection);
|
|
55
|
+
unsubscribe = (key) => this.baseEmitter.unsubscribe(key);
|
|
56
|
+
emit = (key, event) => {
|
|
57
|
+
const message = this.eventToMessage(event);
|
|
58
|
+
return this.baseEmitter.emit(key, message);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Default event-to-message serialization helper.
|
|
63
|
+
*
|
|
64
|
+
* Creates a standardized JSON message format with type, payload, and timestamp.
|
|
65
|
+
* This is the recommended way to serialize events for WebSocket transmission.
|
|
66
|
+
*
|
|
67
|
+
* @param messageType - The message type identifier ("upload_event" or "flow_event")
|
|
68
|
+
* @returns An object with an eventToMessage function
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* // Create emitter with standard serialization
|
|
73
|
+
* const emitter = new TypedEventEmitter<UploadEvent>(
|
|
74
|
+
* baseEmitter,
|
|
75
|
+
* eventToMessageSerializer("upload_event").eventToMessage
|
|
76
|
+
* );
|
|
77
|
+
*
|
|
78
|
+
* // Messages will be formatted as:
|
|
79
|
+
* // {
|
|
80
|
+
* // "type": "upload_event",
|
|
81
|
+
* // "payload": { ...event data... },
|
|
82
|
+
* // "timestamp": "2024-01-15T10:30:00.000Z"
|
|
83
|
+
* // }
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export const eventToMessageSerializer = (messageType) => ({
|
|
87
|
+
eventToMessage: (event) => JSON.stringify({
|
|
88
|
+
type: messageType,
|
|
89
|
+
payload: event,
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
/**
|
|
94
|
+
* Effect-TS context tag for the base untyped event emitter.
|
|
95
|
+
*
|
|
96
|
+
* This is the low-level emitter that broadcasting implementations provide.
|
|
97
|
+
* Most application code should use typed emitters like UploadEventEmitter instead.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Provide a base emitter implementation
|
|
102
|
+
* const baseEmitterLayer = Layer.succeed(BaseEventEmitterService, websocketEmitter);
|
|
103
|
+
*
|
|
104
|
+
* // Use in an Effect
|
|
105
|
+
* const effect = Effect.gen(function* () {
|
|
106
|
+
* const baseEmitter = yield* BaseEventEmitterService;
|
|
107
|
+
* yield* baseEmitter.emit("channel1", "raw message");
|
|
108
|
+
* });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export class BaseEventEmitterService extends Context.Tag("BaseEventEmitter")() {
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Effect-TS context tag for the UploadEvent typed emitter.
|
|
115
|
+
*
|
|
116
|
+
* This provides type-safe event emission for upload progress and lifecycle events.
|
|
117
|
+
* It's the primary way to broadcast upload events to connected clients.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const uploadEffect = Effect.gen(function* () {
|
|
122
|
+
* const emitter = yield* UploadEventEmitter;
|
|
123
|
+
*
|
|
124
|
+
* // Subscribe a client to upload events
|
|
125
|
+
* yield* emitter.subscribe("upload123", websocketConnection);
|
|
126
|
+
*
|
|
127
|
+
* // Emit progress event
|
|
128
|
+
* yield* emitter.emit("upload123", {
|
|
129
|
+
* uploadId: "upload123",
|
|
130
|
+
* type: "progress",
|
|
131
|
+
* offset: 512000,
|
|
132
|
+
* size: 1024000
|
|
133
|
+
* });
|
|
134
|
+
*
|
|
135
|
+
* // Emit completion event
|
|
136
|
+
* yield* emitter.emit("upload123", {
|
|
137
|
+
* uploadId: "upload123",
|
|
138
|
+
* type: "completed",
|
|
139
|
+
* offset: 1024000,
|
|
140
|
+
* size: 1024000
|
|
141
|
+
* });
|
|
142
|
+
* });
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export class UploadEventEmitter extends Context.Tag("UploadEventEmitter")() {
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Effect Layer that creates the UploadEventEmitter from a BaseEventEmitter.
|
|
149
|
+
*
|
|
150
|
+
* This layer automatically wires up JSON serialization for UploadEvent objects
|
|
151
|
+
* with the standard "upload_event" message format.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* const program = Effect.gen(function* () {
|
|
156
|
+
* const emitter = yield* UploadEventEmitter;
|
|
157
|
+
* // Use the emitter...
|
|
158
|
+
* }).pipe(
|
|
159
|
+
* Effect.provide(uploadEventEmitter),
|
|
160
|
+
* Effect.provide(baseEmitterLayer)
|
|
161
|
+
* );
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export const uploadEventEmitter = Layer.effect(UploadEventEmitter, Effect.gen(function* () {
|
|
165
|
+
const baseEmitter = yield* BaseEventEmitterService;
|
|
166
|
+
return new TypedEventEmitter(baseEmitter, eventToMessageSerializer("upload_event").eventToMessage);
|
|
167
|
+
}));
|
|
168
|
+
/**
|
|
169
|
+
* Effect-TS context tag for the FlowEvent typed emitter.
|
|
170
|
+
*
|
|
171
|
+
* This provides type-safe event emission for flow processing lifecycle events.
|
|
172
|
+
* It's used to broadcast flow execution progress, node completion, and errors.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const flowEffect = Effect.gen(function* () {
|
|
177
|
+
* const emitter = yield* FlowEventEmitter;
|
|
178
|
+
*
|
|
179
|
+
* // Subscribe a client to flow job events
|
|
180
|
+
* yield* emitter.subscribe("job123", websocketConnection);
|
|
181
|
+
*
|
|
182
|
+
* // Emit node start event
|
|
183
|
+
* yield* emitter.emit("job123", {
|
|
184
|
+
* jobId: "job123",
|
|
185
|
+
* eventType: "NodeStart",
|
|
186
|
+
* flowId: "flow_resize",
|
|
187
|
+
* nodeId: "resize_1"
|
|
188
|
+
* });
|
|
189
|
+
*
|
|
190
|
+
* // Emit node completion event
|
|
191
|
+
* yield* emitter.emit("job123", {
|
|
192
|
+
* jobId: "job123",
|
|
193
|
+
* eventType: "NodeEnd",
|
|
194
|
+
* flowId: "flow_resize",
|
|
195
|
+
* nodeId: "resize_1",
|
|
196
|
+
* result: { width: 800, height: 600 }
|
|
197
|
+
* });
|
|
198
|
+
* });
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
export class FlowEventEmitter extends Context.Tag("FlowEventEmitter")() {
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Effect Layer that creates the FlowEventEmitter from a BaseEventEmitter.
|
|
205
|
+
*
|
|
206
|
+
* This layer automatically wires up JSON serialization for FlowEvent objects
|
|
207
|
+
* with the standard "flow_event" message format.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* const program = Effect.gen(function* () {
|
|
212
|
+
* const emitter = yield* FlowEventEmitter;
|
|
213
|
+
* // Use the emitter...
|
|
214
|
+
* }).pipe(
|
|
215
|
+
* Effect.provide(flowEventEmitter),
|
|
216
|
+
* Effect.provide(baseEmitterLayer)
|
|
217
|
+
* );
|
|
218
|
+
* ```
|
|
219
|
+
*/
|
|
220
|
+
export const flowEventEmitter = Layer.effect(FlowEventEmitter, Effect.gen(function* () {
|
|
221
|
+
const baseEmitter = yield* BaseEventEmitterService;
|
|
222
|
+
return new TypedEventEmitter(baseEmitter, eventToMessageSerializer("flow_event").eventToMessage);
|
|
223
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`../uploadista-error-BB-Wdiz9.cjs`),require(`../errors-CRm1FHHT.cjs`);const e=require(`../types-BT-cvi7T.cjs`);exports.BaseEventEmitterService=e.BaseEventEmitterService,exports.BaseKvStoreService=e.BaseKvStoreService,exports.BufferedUploadFileDataStore=e.BufferedUploadFileDataStore,exports.DataStoreRegistry=e.DataStoreRegistry,exports.FlowEventEmitter=e.FlowEventEmitter,exports.FlowJobKVStore=e.FlowJobKVStore,exports.MiddlewareService=e.MiddlewareService,exports.MiddlewareServiceLive=e.MiddlewareServiceLive,exports.TypedEventEmitter=e.TypedEventEmitter,exports.TypedKvStore=e.TypedKvStore,exports.UploadEventEmitter=e.UploadEventEmitter,exports.UploadEventType=e.UploadEventType,exports.UploadFileDataStore=e.UploadFileDataStore,exports.UploadFileDataStores=e.UploadFileDataStores,exports.UploadFileKVStore=e.UploadFileKVStore,exports.eventToMessageSerializer=e.eventToMessageSerializer,exports.flowEventEmitter=e.flowEventEmitter,exports.flowJobKvStore=e.flowJobKvStore,exports.inputFileSchema=e.inputFileSchema,exports.jsonSerializer=e.jsonSerializer,exports.uploadEventEmitter=e.uploadEventEmitter,exports.uploadEventSchema=e.uploadEventSchema,exports.uploadFileKvStore=e.uploadFileKvStore,exports.uploadFileSchema=e.uploadFileSchema,exports.webSocketMessageSchema=e.webSocketMessageSchema;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import "../uploadista-error-kKlhLRhY.cjs";
|
|
2
|
+
import "../index-BtBZHVmz.cjs";
|
|
3
|
+
import { BaseEventEmitter, BaseEventEmitterService, BaseKvStore, BaseKvStoreService, BufferedUploadFileDataStore, DataStore, DataStoreCapabilities, DataStoreRegistry, DataStoreWriteOptions, EventEmitter, FlowEventEmitter, FlowJobKVStore, InputFile, KvStore, Middleware, MiddlewareContext, MiddlewareNext, MiddlewareService, MiddlewareServiceLive, TypedEventEmitter, TypedKvStore, UploadEvent, UploadEventEmitter, UploadEventType, UploadFile, UploadFileDataStore, UploadFileDataStores, UploadFileDataStoresShape, UploadFileKVStore, UploadStrategy, WebSocketConnection, WebSocketMessage, eventToMessageSerializer, flowEventEmitter, flowJobKvStore, inputFileSchema, jsonSerializer, uploadEventEmitter, uploadEventSchema, uploadFileKvStore, uploadFileSchema, webSocketMessageSchema } from "../index-BO8GZlbD.cjs";
|
|
4
|
+
import "../generate-id-LjJRLD6N.cjs";
|
|
5
|
+
import "../semaphore-BHprIjFI.cjs";
|
|
6
|
+
export { BaseEventEmitter, BaseEventEmitterService, BaseKvStore, BaseKvStoreService, BufferedUploadFileDataStore, DataStore, DataStoreCapabilities, DataStoreRegistry, DataStoreWriteOptions, EventEmitter, FlowEventEmitter, FlowJobKVStore, InputFile, KvStore, Middleware, MiddlewareContext, MiddlewareNext, MiddlewareService, MiddlewareServiceLive, TypedEventEmitter, TypedKvStore, UploadEvent, UploadEventEmitter, UploadEventType, UploadFile, UploadFileDataStore, UploadFileDataStores, UploadFileDataStoresShape, UploadFileKVStore, UploadStrategy, WebSocketConnection, WebSocketMessage, eventToMessageSerializer, flowEventEmitter, flowJobKvStore, inputFileSchema, jsonSerializer, uploadEventEmitter, uploadEventSchema, uploadFileKvStore, uploadFileSchema, webSocketMessageSchema };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./data-store";
|
|
2
|
+
export * from "./event-broadcaster";
|
|
3
|
+
export * from "./event-emitter";
|
|
4
|
+
export * from "./input-file";
|
|
5
|
+
export * from "./kv-store";
|
|
6
|
+
export * from "./middleware";
|
|
7
|
+
export * from "./upload-event";
|
|
8
|
+
export * from "./upload-file";
|
|
9
|
+
export * from "./websocket";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./data-store";
|
|
2
|
+
export * from "./event-broadcaster";
|
|
3
|
+
export * from "./event-emitter";
|
|
4
|
+
export * from "./input-file";
|
|
5
|
+
export * from "./kv-store";
|
|
6
|
+
export * from "./middleware";
|
|
7
|
+
export * from "./upload-event";
|
|
8
|
+
export * from "./upload-file";
|
|
9
|
+
export * from "./websocket";
|