@gjsify/web-streams 0.1.0
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/README.md +30 -0
- package/lib/esm/index.js +121 -0
- package/lib/esm/queuing-strategies.js +56 -0
- package/lib/esm/readable-stream.js +1064 -0
- package/lib/esm/text-decoder-stream.js +126 -0
- package/lib/esm/text-encoder-stream.js +46 -0
- package/lib/esm/transform-stream.js +336 -0
- package/lib/esm/util.js +161 -0
- package/lib/esm/writable-stream.js +676 -0
- package/lib/types/index.d.ts +77 -0
- package/lib/types/queuing-strategies.d.ts +18 -0
- package/lib/types/readable-stream.d.ts +61 -0
- package/lib/types/text-decoder-stream.d.ts +16 -0
- package/lib/types/text-encoder-stream.d.ts +15 -0
- package/lib/types/transform-stream.d.ts +21 -0
- package/lib/types/util.d.ts +40 -0
- package/lib/types/writable-stream.d.ts +49 -0
- package/package.json +44 -0
- package/src/index.spec.ts +2043 -0
- package/src/index.ts +131 -0
- package/src/queuing-strategies.ts +67 -0
- package/src/readable-stream.ts +1337 -0
- package/src/test.mts +6 -0
- package/src/text-decoder-stream.ts +183 -0
- package/src/text-encoder-stream.ts +62 -0
- package/src/transform-stream.ts +410 -0
- package/src/util.ts +170 -0
- package/src/writable-stream.ts +773 -0
- package/tsconfig.json +32 -0
- package/tsconfig.tsbuildinfo +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# @gjsify/web-streams
|
|
2
|
+
|
|
3
|
+
GJS implementation of the Web Streams API (ReadableStream, WritableStream, TransformStream).
|
|
4
|
+
|
|
5
|
+
Part of the [gjsify](https://github.com/gjsify/gjsify) project — Node.js and Web APIs for GJS (GNOME JavaScript).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @gjsify/web-streams
|
|
11
|
+
# or
|
|
12
|
+
yarn add @gjsify/web-streams
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { ReadableStream, WritableStream, TransformStream } from '@gjsify/web-streams';
|
|
19
|
+
|
|
20
|
+
const readable = new ReadableStream({
|
|
21
|
+
start(controller) {
|
|
22
|
+
controller.enqueue('hello');
|
|
23
|
+
controller.close();
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## License
|
|
29
|
+
|
|
30
|
+
MIT
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { WritableStream } from "./writable-stream.js";
|
|
2
|
+
import { ReadableStream } from "./readable-stream.js";
|
|
3
|
+
import { TransformStream } from "./transform-stream.js";
|
|
4
|
+
import { ByteLengthQueuingStrategy, CountQueuingStrategy } from "./queuing-strategies.js";
|
|
5
|
+
import { TextEncoderStream } from "./text-encoder-stream.js";
|
|
6
|
+
import { TextDecoderStream } from "./text-decoder-stream.js";
|
|
7
|
+
function isNativeStreamUsable(Ctor, method) {
|
|
8
|
+
try {
|
|
9
|
+
if (typeof Ctor !== "function") return false;
|
|
10
|
+
return typeof Ctor.prototype[method] === "function";
|
|
11
|
+
} catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const _ReadableStream = isNativeStreamUsable(globalThis.ReadableStream, "getReader") ? globalThis.ReadableStream : ReadableStream;
|
|
16
|
+
const _WritableStream = isNativeStreamUsable(globalThis.WritableStream, "getWriter") ? globalThis.WritableStream : WritableStream;
|
|
17
|
+
const _TransformStream = isNativeStreamUsable(globalThis.TransformStream, "readable") ? globalThis.TransformStream : TransformStream;
|
|
18
|
+
const _ByteLengthQueuingStrategy = typeof globalThis.ByteLengthQueuingStrategy === "function" ? globalThis.ByteLengthQueuingStrategy : ByteLengthQueuingStrategy;
|
|
19
|
+
const _CountQueuingStrategy = typeof globalThis.CountQueuingStrategy === "function" ? globalThis.CountQueuingStrategy : CountQueuingStrategy;
|
|
20
|
+
const _TextEncoderStream = typeof globalThis.TextEncoderStream === "function" ? globalThis.TextEncoderStream : TextEncoderStream;
|
|
21
|
+
const _TextDecoderStream = typeof globalThis.TextDecoderStream === "function" ? globalThis.TextDecoderStream : TextDecoderStream;
|
|
22
|
+
if (!isNativeStreamUsable(globalThis.ReadableStream, "getReader")) {
|
|
23
|
+
globalThis.ReadableStream = ReadableStream;
|
|
24
|
+
}
|
|
25
|
+
if (!isNativeStreamUsable(globalThis.WritableStream, "getWriter")) {
|
|
26
|
+
globalThis.WritableStream = WritableStream;
|
|
27
|
+
}
|
|
28
|
+
if (!isNativeStreamUsable(globalThis.TransformStream, "readable")) {
|
|
29
|
+
globalThis.TransformStream = TransformStream;
|
|
30
|
+
}
|
|
31
|
+
if (typeof globalThis.ByteLengthQueuingStrategy === "undefined") {
|
|
32
|
+
globalThis.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy;
|
|
33
|
+
}
|
|
34
|
+
if (typeof globalThis.CountQueuingStrategy === "undefined") {
|
|
35
|
+
globalThis.CountQueuingStrategy = CountQueuingStrategy;
|
|
36
|
+
}
|
|
37
|
+
if (typeof globalThis.TextEncoderStream === "undefined") {
|
|
38
|
+
globalThis.TextEncoderStream = TextEncoderStream;
|
|
39
|
+
}
|
|
40
|
+
if (typeof globalThis.TextDecoderStream === "undefined") {
|
|
41
|
+
globalThis.TextDecoderStream = TextDecoderStream;
|
|
42
|
+
}
|
|
43
|
+
import { WritableStreamDefaultWriter as WritableStreamDefaultWriter2, WritableStreamDefaultController as WritableStreamDefaultController2 } from "./writable-stream.js";
|
|
44
|
+
import { ReadableStreamDefaultReader as ReadableStreamDefaultReader2, ReadableStreamDefaultController as ReadableStreamDefaultController2 } from "./readable-stream.js";
|
|
45
|
+
import { TransformStreamDefaultController as TransformStreamDefaultController2 } from "./transform-stream.js";
|
|
46
|
+
import {
|
|
47
|
+
isWritableStream,
|
|
48
|
+
isWritableStreamLocked,
|
|
49
|
+
writableStreamAbort,
|
|
50
|
+
writableStreamClose,
|
|
51
|
+
writableStreamCloseQueuedOrInFlight,
|
|
52
|
+
writableStreamDefaultWriterCloseWithErrorPropagation,
|
|
53
|
+
writableStreamDefaultControllerErrorIfNeeded,
|
|
54
|
+
createWritableStream
|
|
55
|
+
} from "./writable-stream.js";
|
|
56
|
+
import {
|
|
57
|
+
isReadableStream,
|
|
58
|
+
isReadableStreamLocked,
|
|
59
|
+
readableStreamCancel,
|
|
60
|
+
readableStreamClose,
|
|
61
|
+
readableStreamError,
|
|
62
|
+
readableStreamDefaultControllerClose,
|
|
63
|
+
readableStreamDefaultControllerEnqueue,
|
|
64
|
+
readableStreamDefaultControllerError,
|
|
65
|
+
readableStreamDefaultControllerGetDesiredSize,
|
|
66
|
+
readableStreamDefaultControllerCanCloseOrEnqueue,
|
|
67
|
+
readableStreamDefaultControllerHasBackpressure,
|
|
68
|
+
setupReadableStreamDefaultController,
|
|
69
|
+
createReadableStream
|
|
70
|
+
} from "./readable-stream.js";
|
|
71
|
+
import {
|
|
72
|
+
isTransformStream,
|
|
73
|
+
isTransformStreamDefaultController
|
|
74
|
+
} from "./transform-stream.js";
|
|
75
|
+
var index_default = {
|
|
76
|
+
WritableStream: _WritableStream,
|
|
77
|
+
ReadableStream: _ReadableStream,
|
|
78
|
+
TransformStream: _TransformStream,
|
|
79
|
+
ByteLengthQueuingStrategy: _ByteLengthQueuingStrategy,
|
|
80
|
+
CountQueuingStrategy: _CountQueuingStrategy,
|
|
81
|
+
TextEncoderStream: _TextEncoderStream,
|
|
82
|
+
TextDecoderStream: _TextDecoderStream
|
|
83
|
+
};
|
|
84
|
+
export {
|
|
85
|
+
_ByteLengthQueuingStrategy as ByteLengthQueuingStrategy,
|
|
86
|
+
_CountQueuingStrategy as CountQueuingStrategy,
|
|
87
|
+
_ReadableStream as ReadableStream,
|
|
88
|
+
ReadableStreamDefaultController2 as ReadableStreamDefaultController,
|
|
89
|
+
ReadableStreamDefaultReader2 as ReadableStreamDefaultReader,
|
|
90
|
+
_TextDecoderStream as TextDecoderStream,
|
|
91
|
+
_TextEncoderStream as TextEncoderStream,
|
|
92
|
+
_TransformStream as TransformStream,
|
|
93
|
+
TransformStreamDefaultController2 as TransformStreamDefaultController,
|
|
94
|
+
_WritableStream as WritableStream,
|
|
95
|
+
WritableStreamDefaultController2 as WritableStreamDefaultController,
|
|
96
|
+
WritableStreamDefaultWriter2 as WritableStreamDefaultWriter,
|
|
97
|
+
createReadableStream,
|
|
98
|
+
createWritableStream,
|
|
99
|
+
index_default as default,
|
|
100
|
+
isReadableStream,
|
|
101
|
+
isReadableStreamLocked,
|
|
102
|
+
isTransformStream,
|
|
103
|
+
isTransformStreamDefaultController,
|
|
104
|
+
isWritableStream,
|
|
105
|
+
isWritableStreamLocked,
|
|
106
|
+
readableStreamCancel,
|
|
107
|
+
readableStreamClose,
|
|
108
|
+
readableStreamDefaultControllerCanCloseOrEnqueue,
|
|
109
|
+
readableStreamDefaultControllerClose,
|
|
110
|
+
readableStreamDefaultControllerEnqueue,
|
|
111
|
+
readableStreamDefaultControllerError,
|
|
112
|
+
readableStreamDefaultControllerGetDesiredSize,
|
|
113
|
+
readableStreamDefaultControllerHasBackpressure,
|
|
114
|
+
readableStreamError,
|
|
115
|
+
setupReadableStreamDefaultController,
|
|
116
|
+
writableStreamAbort,
|
|
117
|
+
writableStreamClose,
|
|
118
|
+
writableStreamCloseQueuedOrInFlight,
|
|
119
|
+
writableStreamDefaultControllerErrorIfNeeded,
|
|
120
|
+
writableStreamDefaultWriterCloseWithErrorPropagation
|
|
121
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const byteSizeFunction = Object.defineProperty(
|
|
2
|
+
(chunk) => chunk.byteLength,
|
|
3
|
+
"name",
|
|
4
|
+
{ value: "size" }
|
|
5
|
+
);
|
|
6
|
+
const countSizeFunction = Object.defineProperty(
|
|
7
|
+
() => 1,
|
|
8
|
+
"name",
|
|
9
|
+
{ value: "size" }
|
|
10
|
+
);
|
|
11
|
+
class ByteLengthQueuingStrategy {
|
|
12
|
+
#highWaterMark;
|
|
13
|
+
constructor(init) {
|
|
14
|
+
if (init == null || typeof init !== "object") {
|
|
15
|
+
throw new TypeError("init must be an object");
|
|
16
|
+
}
|
|
17
|
+
if (init.highWaterMark === void 0) {
|
|
18
|
+
throw new TypeError("init.highWaterMark is required");
|
|
19
|
+
}
|
|
20
|
+
this.#highWaterMark = +init.highWaterMark;
|
|
21
|
+
}
|
|
22
|
+
get highWaterMark() {
|
|
23
|
+
return this.#highWaterMark;
|
|
24
|
+
}
|
|
25
|
+
get size() {
|
|
26
|
+
return byteSizeFunction;
|
|
27
|
+
}
|
|
28
|
+
get [Symbol.toStringTag]() {
|
|
29
|
+
return "ByteLengthQueuingStrategy";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class CountQueuingStrategy {
|
|
33
|
+
#highWaterMark;
|
|
34
|
+
constructor(init) {
|
|
35
|
+
if (init == null || typeof init !== "object") {
|
|
36
|
+
throw new TypeError("init must be an object");
|
|
37
|
+
}
|
|
38
|
+
if (init.highWaterMark === void 0) {
|
|
39
|
+
throw new TypeError("init.highWaterMark is required");
|
|
40
|
+
}
|
|
41
|
+
this.#highWaterMark = +init.highWaterMark;
|
|
42
|
+
}
|
|
43
|
+
get highWaterMark() {
|
|
44
|
+
return this.#highWaterMark;
|
|
45
|
+
}
|
|
46
|
+
get size() {
|
|
47
|
+
return countSizeFunction;
|
|
48
|
+
}
|
|
49
|
+
get [Symbol.toStringTag]() {
|
|
50
|
+
return "CountQueuingStrategy";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
ByteLengthQueuingStrategy,
|
|
55
|
+
CountQueuingStrategy
|
|
56
|
+
};
|