Skip to content
File

Blob: src/workerd/api/streams/transform.h

cpp78 lines
1// Copyright (c) 2017-2022 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4 
5#pragma once
6 
7#include "readable.h"
8#include "writable.h"
9 
10namespace workerd::api {
11 
12// A TransformStream is a readable, writable pair in which whatever is written to the writable
13// side can be read from the readable side, possibly transformed into a different type of value.
14//
15// The original version of TransformStream in Workers was nothing more than an identity
16// passthrough that only handled byte data. No actual transformation of the value was performed.
17// The original version did not conform to the streams standard. That original version has been
18// migrated into the IdentityTransformStream class. If the
19// transformstream_enable_standard_constructor compatibility flag is not enabled, then
20// TransformStream is just an alias for IdentityTransformStream and continues to implement the
21// non-standard behavior. With the transformstream_enable_standard_constructor flag set, however,
22// the TransformStream implements standardized behavior.
23class TransformStream: public jsg::Object {
24 public:
25 explicit TransformStream(jsg::Ref<ReadableStream> readable, jsg::Ref<WritableStream> writable)
26 : readable(kj::mv(readable)),
27 writable(kj::mv(writable)) {}
28 
29 static jsg::Ref<TransformStream> constructor(jsg::Lock& js,
30 jsg::Optional<Transformer> maybeTransformer,
31 jsg::Optional<StreamQueuingStrategy> maybeWritableStrategy,
32 jsg::Optional<StreamQueuingStrategy> maybeReadableStrategy);
33 
34 jsg::Ref<ReadableStream> getReadable() {
35 return readable.addRef();
36 }
37 jsg::Ref<WritableStream> getWritable() {
38 return writable.addRef();
39 }
40 
41 JSG_RESOURCE_TYPE(TransformStream, CompatibilityFlags::Reader flags) {
42 if (flags.getJsgPropertyOnPrototypeTemplate()) {
43 JSG_READONLY_PROTOTYPE_PROPERTY(readable, getReadable);
44 JSG_READONLY_PROTOTYPE_PROPERTY(writable, getWritable);
45 
46 JSG_TS_OVERRIDE(<I = any, O = any> {
47 constructor(transformer?: Transformer<I, O>, writableStrategy?: QueuingStrategy<I>, readableStrategy?: QueuingStrategy<O>);
48 get readable(): ReadableStream<O>;
49 get writable(): WritableStream<I>;
50 });
51 } else {
52 JSG_READONLY_INSTANCE_PROPERTY(readable, getReadable);
53 JSG_READONLY_INSTANCE_PROPERTY(writable, getWritable);
54 
55 JSG_TS_OVERRIDE(<I = any, O = any> {
56 constructor(transformer?: Transformer<I, O>, writableStrategy?: QueuingStrategy<I>, readableStrategy?: QueuingStrategy<O>);
57 readonly readable: ReadableStream<O>;
58 readonly writable: WritableStream<I>;
59 });
60 }
61 }
62 
63 void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
64 tracker.trackField("readable", readable);
65 tracker.trackField("writable", writable);
66 }
67 
68 private:
69 jsg::Ref<ReadableStream> readable;
70 jsg::Ref<WritableStream> writable;
71 
72 void visitForGc(jsg::GcVisitor& visitor) {
73 visitor.visit(readable, writable);
74 }
75};
76 
77} // namespace workerd::api