@sachitv/avro-typescript 0.4.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/esm/_dnt.polyfills.d.ts +11 -0
- package/esm/_dnt.polyfills.js +15 -0
- package/esm/avro_reader.d.ts +156 -0
- package/esm/avro_reader.js +201 -0
- package/esm/avro_writer.d.ts +75 -0
- package/esm/avro_writer.js +105 -0
- package/esm/internal/collections/array_utils.d.ts +4 -0
- package/esm/internal/collections/array_utils.js +18 -0
- package/esm/internal/collections/circular_buffer.d.ts +48 -0
- package/esm/internal/collections/circular_buffer.js +129 -0
- package/esm/internal/crypto/md5.d.ts +12 -0
- package/esm/internal/crypto/md5.js +158 -0
- package/esm/internal/varint.d.ts +6 -0
- package/esm/internal/varint.js +30 -0
- package/esm/mod.d.ts +77 -0
- package/esm/mod.js +73 -0
- package/esm/package.json +3 -0
- package/esm/rpc/definitions/message_definition.d.ts +34 -0
- package/esm/rpc/definitions/message_definition.js +105 -0
- package/esm/rpc/definitions/protocol_definitions.d.ts +197 -0
- package/esm/rpc/definitions/protocol_definitions.js +1 -0
- package/esm/rpc/message_endpoint/base.d.ts +43 -0
- package/esm/rpc/message_endpoint/base.js +81 -0
- package/esm/rpc/message_endpoint/emitter.d.ts +96 -0
- package/esm/rpc/message_endpoint/emitter.js +245 -0
- package/esm/rpc/message_endpoint/helpers.d.ts +37 -0
- package/esm/rpc/message_endpoint/helpers.js +68 -0
- package/esm/rpc/message_endpoint/listener.d.ts +37 -0
- package/esm/rpc/message_endpoint/listener.js +212 -0
- package/esm/rpc/protocol/frame_assembler.d.ts +11 -0
- package/esm/rpc/protocol/frame_assembler.js +77 -0
- package/esm/rpc/protocol/protocol_helpers.d.ts +59 -0
- package/esm/rpc/protocol/protocol_helpers.js +123 -0
- package/esm/rpc/protocol/transports/fetch.d.ts +9 -0
- package/esm/rpc/protocol/transports/fetch.js +30 -0
- package/esm/rpc/protocol/transports/in_memory.d.ts +27 -0
- package/esm/rpc/protocol/transports/in_memory.js +125 -0
- package/esm/rpc/protocol/transports/transport_helpers.d.ts +118 -0
- package/esm/rpc/protocol/transports/transport_helpers.js +112 -0
- package/esm/rpc/protocol/transports/websocket.d.ts +9 -0
- package/esm/rpc/protocol/transports/websocket.js +102 -0
- package/esm/rpc/protocol/wire_format/framing.d.ts +44 -0
- package/esm/rpc/protocol/wire_format/framing.js +74 -0
- package/esm/rpc/protocol/wire_format/handshake.d.ts +110 -0
- package/esm/rpc/protocol/wire_format/handshake.js +239 -0
- package/esm/rpc/protocol/wire_format/messages.d.ts +192 -0
- package/esm/rpc/protocol/wire_format/messages.js +175 -0
- package/esm/rpc/protocol/wire_format/metadata.d.ts +44 -0
- package/esm/rpc/protocol/wire_format/metadata.js +74 -0
- package/esm/rpc/protocol_core.d.ts +121 -0
- package/esm/rpc/protocol_core.js +285 -0
- package/esm/schemas/base_type.d.ts +41 -0
- package/esm/schemas/base_type.js +49 -0
- package/esm/schemas/complex/array_type.d.ts +100 -0
- package/esm/schemas/complex/array_type.js +299 -0
- package/esm/schemas/complex/enum_type.d.ts +81 -0
- package/esm/schemas/complex/enum_type.js +217 -0
- package/esm/schemas/complex/fixed_type.d.ts +99 -0
- package/esm/schemas/complex/fixed_type.js +208 -0
- package/esm/schemas/complex/map_type.d.ts +97 -0
- package/esm/schemas/complex/map_type.js +290 -0
- package/esm/schemas/complex/named_type.d.ts +30 -0
- package/esm/schemas/complex/named_type.js +57 -0
- package/esm/schemas/complex/record_type.d.ts +165 -0
- package/esm/schemas/complex/record_type.js +547 -0
- package/esm/schemas/complex/resolve_names.d.ts +32 -0
- package/esm/schemas/complex/resolve_names.js +85 -0
- package/esm/schemas/complex/union_type.d.ts +116 -0
- package/esm/schemas/complex/union_type.js +392 -0
- package/esm/schemas/error.d.ts +31 -0
- package/esm/schemas/error.js +67 -0
- package/esm/schemas/json.d.ts +6 -0
- package/esm/schemas/json.js +35 -0
- package/esm/schemas/logical/decimal_logical_type.d.ts +49 -0
- package/esm/schemas/logical/decimal_logical_type.js +145 -0
- package/esm/schemas/logical/duration_logical_type.d.ts +66 -0
- package/esm/schemas/logical/duration_logical_type.js +112 -0
- package/esm/schemas/logical/logical_type.d.ts +138 -0
- package/esm/schemas/logical/logical_type.js +240 -0
- package/esm/schemas/logical/temporal_logical_types.d.ts +215 -0
- package/esm/schemas/logical/temporal_logical_types.js +364 -0
- package/esm/schemas/logical/uuid_logical_type.d.ts +63 -0
- package/esm/schemas/logical/uuid_logical_type.js +146 -0
- package/esm/schemas/primitive/boolean_type.d.ts +49 -0
- package/esm/schemas/primitive/boolean_type.js +75 -0
- package/esm/schemas/primitive/bytes_type.d.ts +49 -0
- package/esm/schemas/primitive/bytes_type.js +136 -0
- package/esm/schemas/primitive/double_type.d.ts +38 -0
- package/esm/schemas/primitive/double_type.js +98 -0
- package/esm/schemas/primitive/fixed_size_base_type.d.ts +28 -0
- package/esm/schemas/primitive/fixed_size_base_type.js +33 -0
- package/esm/schemas/primitive/float_type.d.ts +38 -0
- package/esm/schemas/primitive/float_type.js +88 -0
- package/esm/schemas/primitive/int_type.d.ts +31 -0
- package/esm/schemas/primitive/int_type.js +63 -0
- package/esm/schemas/primitive/long_type.d.ts +36 -0
- package/esm/schemas/primitive/long_type.js +95 -0
- package/esm/schemas/primitive/null_type.d.ts +45 -0
- package/esm/schemas/primitive/null_type.js +71 -0
- package/esm/schemas/primitive/primitive_type.d.ts +17 -0
- package/esm/schemas/primitive/primitive_type.js +27 -0
- package/esm/schemas/primitive/string_type.d.ts +34 -0
- package/esm/schemas/primitive/string_type.js +81 -0
- package/esm/schemas/resolver.d.ts +25 -0
- package/esm/schemas/resolver.js +25 -0
- package/esm/schemas/type.d.ts +101 -0
- package/esm/schemas/type.js +6 -0
- package/esm/serialization/avro_constants.d.ts +13 -0
- package/esm/serialization/avro_constants.js +29 -0
- package/esm/serialization/avro_file_parser.d.ts +68 -0
- package/esm/serialization/avro_file_parser.js +191 -0
- package/esm/serialization/avro_file_writer.d.ts +63 -0
- package/esm/serialization/avro_file_writer.js +235 -0
- package/esm/serialization/buffers/blob_readable_buffer.d.ts +53 -0
- package/esm/serialization/buffers/blob_readable_buffer.js +80 -0
- package/esm/serialization/buffers/buffer.d.ts +37 -0
- package/esm/serialization/buffers/buffer.js +1 -0
- package/esm/serialization/buffers/in_memory_buffer.d.ts +121 -0
- package/esm/serialization/buffers/in_memory_buffer.js +206 -0
- package/esm/serialization/clamp.d.ts +10 -0
- package/esm/serialization/clamp.js +19 -0
- package/esm/serialization/compare_bytes.d.ts +9 -0
- package/esm/serialization/compare_bytes.js +45 -0
- package/esm/serialization/conversion.d.ts +8 -0
- package/esm/serialization/conversion.js +15 -0
- package/esm/serialization/decoders/decoder.d.ts +16 -0
- package/esm/serialization/decoders/decoder.js +1 -0
- package/esm/serialization/decoders/deflate_decoder.d.ts +15 -0
- package/esm/serialization/decoders/deflate_decoder.js +26 -0
- package/esm/serialization/decoders/null_decoder.d.ts +12 -0
- package/esm/serialization/decoders/null_decoder.js +13 -0
- package/esm/serialization/encoders/deflate_encoder.d.ts +15 -0
- package/esm/serialization/encoders/deflate_encoder.js +26 -0
- package/esm/serialization/encoders/encoder.d.ts +16 -0
- package/esm/serialization/encoders/encoder.js +1 -0
- package/esm/serialization/encoders/null_encoder.d.ts +12 -0
- package/esm/serialization/encoders/null_encoder.js +13 -0
- package/esm/serialization/manipulate_bytes.d.ts +6 -0
- package/esm/serialization/manipulate_bytes.js +13 -0
- package/esm/serialization/read_uint_le.d.ts +4 -0
- package/esm/serialization/read_uint_le.js +14 -0
- package/esm/serialization/streams/fixed_size_stream_readable_buffer_adapter.d.ts +52 -0
- package/esm/serialization/streams/fixed_size_stream_readable_buffer_adapter.js +129 -0
- package/esm/serialization/streams/forward_only_stream_readable_buffer_adapter.d.ts +36 -0
- package/esm/serialization/streams/forward_only_stream_readable_buffer_adapter.js +114 -0
- package/esm/serialization/streams/stream_readable_buffer.d.ts +41 -0
- package/esm/serialization/streams/stream_readable_buffer.js +64 -0
- package/esm/serialization/streams/stream_readable_buffer_adapter.d.ts +38 -0
- package/esm/serialization/streams/stream_readable_buffer_adapter.js +105 -0
- package/esm/serialization/streams/stream_writable_buffer.d.ts +42 -0
- package/esm/serialization/streams/stream_writable_buffer.js +64 -0
- package/esm/serialization/streams/stream_writable_buffer_adapter.d.ts +36 -0
- package/esm/serialization/streams/stream_writable_buffer_adapter.js +65 -0
- package/esm/serialization/streams/streams.d.ts +29 -0
- package/esm/serialization/streams/streams.js +1 -0
- package/esm/serialization/tap.d.ts +427 -0
- package/esm/serialization/tap.js +605 -0
- package/esm/serialization/text_encoding.d.ts +12 -0
- package/esm/serialization/text_encoding.js +14 -0
- package/esm/type/create_type.d.ts +54 -0
- package/esm/type/create_type.js +401 -0
- package/package.json +33 -0
- package/sachitv-avro-typescript-0.4.0.tgz +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { IReadableBuffer } from "../buffers/buffer.js";
|
|
2
|
+
import type { IStreamReadableBuffer } from "./streams.js";
|
|
3
|
+
import { CircularBuffer } from "../../internal/collections/circular_buffer.js";
|
|
4
|
+
/**
|
|
5
|
+
* A limited buffer adapter that maintains a rolling window of stream data.
|
|
6
|
+
* This provides memory-efficient random access within a sliding window,
|
|
7
|
+
* but cannot access data that has been discarded from the window.
|
|
8
|
+
*
|
|
9
|
+
* Key features:
|
|
10
|
+
* - Rolling window: Maintains only a limited amount of data in memory
|
|
11
|
+
* - Forward access: Can read data ahead in the stream
|
|
12
|
+
* - Limited backward access: Can only access data within the current window
|
|
13
|
+
* - Memory efficient: Suitable for large streams where full buffering is impractical
|
|
14
|
+
*
|
|
15
|
+
* Limitations:
|
|
16
|
+
* - Cannot access data before the current window start
|
|
17
|
+
* - Window size determines maximum backward seek distance
|
|
18
|
+
*/
|
|
19
|
+
export declare class FixedSizeStreamReadableBufferAdapter implements IReadableBuffer {
|
|
20
|
+
#private;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new limited buffer adapter.
|
|
23
|
+
*
|
|
24
|
+
* @param streamBuffer The stream buffer to read from
|
|
25
|
+
* @param windowSize The size of the rolling window in bytes
|
|
26
|
+
* @param circularBuffer Optional circular buffer for testing
|
|
27
|
+
*/
|
|
28
|
+
constructor(streamBuffer: IStreamReadableBuffer, windowSize: number, circularBuffer?: CircularBuffer);
|
|
29
|
+
/**
|
|
30
|
+
* Gets the total length of the buffer.
|
|
31
|
+
* For limited buffers, this returns the current buffer end position.
|
|
32
|
+
* Note: This may not represent the total stream length if not fully buffered.
|
|
33
|
+
*
|
|
34
|
+
* @returns The current buffer length in bytes
|
|
35
|
+
*/
|
|
36
|
+
length(): Promise<number>;
|
|
37
|
+
/**
|
|
38
|
+
* Reads a sequence of bytes from the buffer starting at the specified offset.
|
|
39
|
+
* The offset is relative to the stream start.
|
|
40
|
+
*
|
|
41
|
+
* @param offset The byte offset to start reading from (0-based, stream-relative)
|
|
42
|
+
* @param size The number of bytes to read
|
|
43
|
+
* @returns A Promise that resolves to a new Uint8Array containing the read bytes, or undefined if the read would exceed buffer bounds
|
|
44
|
+
*/
|
|
45
|
+
read(offset: number, size: number): Promise<Uint8Array | undefined>;
|
|
46
|
+
/**
|
|
47
|
+
* Checks if more data can be read starting at the given offset.
|
|
48
|
+
* @param offset The byte offset to check.
|
|
49
|
+
* @returns True if at least one byte can be read from the offset.
|
|
50
|
+
*/
|
|
51
|
+
canReadMore(offset: number): Promise<boolean>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _FixedSizeStreamReadableBufferAdapter_instances, _FixedSizeStreamReadableBufferAdapter_streamBuffer, _FixedSizeStreamReadableBufferAdapter_windowSize, _FixedSizeStreamReadableBufferAdapter_circularBuffer, _FixedSizeStreamReadableBufferAdapter_eof, _FixedSizeStreamReadableBufferAdapter_extractFromBuffer, _FixedSizeStreamReadableBufferAdapter_fillBuffer;
|
|
13
|
+
import { CircularBuffer } from "../../internal/collections/circular_buffer.js";
|
|
14
|
+
/**
|
|
15
|
+
* A limited buffer adapter that maintains a rolling window of stream data.
|
|
16
|
+
* This provides memory-efficient random access within a sliding window,
|
|
17
|
+
* but cannot access data that has been discarded from the window.
|
|
18
|
+
*
|
|
19
|
+
* Key features:
|
|
20
|
+
* - Rolling window: Maintains only a limited amount of data in memory
|
|
21
|
+
* - Forward access: Can read data ahead in the stream
|
|
22
|
+
* - Limited backward access: Can only access data within the current window
|
|
23
|
+
* - Memory efficient: Suitable for large streams where full buffering is impractical
|
|
24
|
+
*
|
|
25
|
+
* Limitations:
|
|
26
|
+
* - Cannot access data before the current window start
|
|
27
|
+
* - Window size determines maximum backward seek distance
|
|
28
|
+
*/
|
|
29
|
+
export class FixedSizeStreamReadableBufferAdapter {
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new limited buffer adapter.
|
|
32
|
+
*
|
|
33
|
+
* @param streamBuffer The stream buffer to read from
|
|
34
|
+
* @param windowSize The size of the rolling window in bytes
|
|
35
|
+
* @param circularBuffer Optional circular buffer for testing
|
|
36
|
+
*/
|
|
37
|
+
constructor(streamBuffer, windowSize, circularBuffer) {
|
|
38
|
+
_FixedSizeStreamReadableBufferAdapter_instances.add(this);
|
|
39
|
+
_FixedSizeStreamReadableBufferAdapter_streamBuffer.set(this, void 0);
|
|
40
|
+
_FixedSizeStreamReadableBufferAdapter_windowSize.set(this, void 0);
|
|
41
|
+
_FixedSizeStreamReadableBufferAdapter_circularBuffer.set(this, void 0);
|
|
42
|
+
_FixedSizeStreamReadableBufferAdapter_eof.set(this, void 0);
|
|
43
|
+
if (windowSize <= 0) {
|
|
44
|
+
throw new RangeError("Window size must be positive");
|
|
45
|
+
}
|
|
46
|
+
__classPrivateFieldSet(this, _FixedSizeStreamReadableBufferAdapter_streamBuffer, streamBuffer, "f");
|
|
47
|
+
__classPrivateFieldSet(this, _FixedSizeStreamReadableBufferAdapter_windowSize, windowSize, "f");
|
|
48
|
+
__classPrivateFieldSet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, circularBuffer ?? new CircularBuffer(windowSize), "f");
|
|
49
|
+
__classPrivateFieldSet(this, _FixedSizeStreamReadableBufferAdapter_eof, false, "f");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Gets the total length of the buffer.
|
|
53
|
+
* For limited buffers, this returns the current buffer end position.
|
|
54
|
+
* Note: This may not represent the total stream length if not fully buffered.
|
|
55
|
+
*
|
|
56
|
+
* @returns The current buffer length in bytes
|
|
57
|
+
*/
|
|
58
|
+
// deno-lint-ignore require-await
|
|
59
|
+
async length() {
|
|
60
|
+
return __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").windowEnd();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reads a sequence of bytes from the buffer starting at the specified offset.
|
|
64
|
+
* The offset is relative to the stream start.
|
|
65
|
+
*
|
|
66
|
+
* @param offset The byte offset to start reading from (0-based, stream-relative)
|
|
67
|
+
* @param size The number of bytes to read
|
|
68
|
+
* @returns A Promise that resolves to a new Uint8Array containing the read bytes, or undefined if the read would exceed buffer bounds
|
|
69
|
+
*/
|
|
70
|
+
async read(offset, size) {
|
|
71
|
+
if (offset < 0 || size < 0) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
// Check if requested size exceeds window size - throw error immediately
|
|
75
|
+
if (size > __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_windowSize, "f")) {
|
|
76
|
+
throw new RangeError(`Requested size ${size} exceeds window size ${__classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_windowSize, "f")}`);
|
|
77
|
+
}
|
|
78
|
+
// Check if offset is before the current window start - raise error
|
|
79
|
+
if (offset < __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").windowStart()) {
|
|
80
|
+
throw new RangeError(`Cannot read data before window start. Offset ${offset} is before window start ${__classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").windowStart()}`);
|
|
81
|
+
}
|
|
82
|
+
// Check if data is already in cache
|
|
83
|
+
if (offset + size <= __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").windowEnd()) {
|
|
84
|
+
// Data is already cached, extract it directly
|
|
85
|
+
return __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_instances, "m", _FixedSizeStreamReadableBufferAdapter_extractFromBuffer).call(this, offset, size);
|
|
86
|
+
}
|
|
87
|
+
// Data is not in cache, wait until it's loaded
|
|
88
|
+
await __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_instances, "m", _FixedSizeStreamReadableBufferAdapter_fillBuffer).call(this, offset + size);
|
|
89
|
+
// Check if the requested range is available after filling
|
|
90
|
+
if (offset + size > __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").windowEnd()) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
// Extract data from buffer
|
|
94
|
+
return __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_instances, "m", _FixedSizeStreamReadableBufferAdapter_extractFromBuffer).call(this, offset, size);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Checks if more data can be read starting at the given offset.
|
|
98
|
+
* @param offset The byte offset to check.
|
|
99
|
+
* @returns True if at least one byte can be read from the offset.
|
|
100
|
+
*/
|
|
101
|
+
async canReadMore(offset) {
|
|
102
|
+
const result = await this.read(offset, 1);
|
|
103
|
+
return result !== undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
_FixedSizeStreamReadableBufferAdapter_streamBuffer = new WeakMap(), _FixedSizeStreamReadableBufferAdapter_windowSize = new WeakMap(), _FixedSizeStreamReadableBufferAdapter_circularBuffer = new WeakMap(), _FixedSizeStreamReadableBufferAdapter_eof = new WeakMap(), _FixedSizeStreamReadableBufferAdapter_instances = new WeakSet(), _FixedSizeStreamReadableBufferAdapter_extractFromBuffer = function _FixedSizeStreamReadableBufferAdapter_extractFromBuffer(offset, size) {
|
|
107
|
+
return __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").get(offset, size);
|
|
108
|
+
}, _FixedSizeStreamReadableBufferAdapter_fillBuffer =
|
|
109
|
+
/**
|
|
110
|
+
* Fills the buffer with data from the stream until at least targetOffset is reached.
|
|
111
|
+
*/
|
|
112
|
+
async function _FixedSizeStreamReadableBufferAdapter_fillBuffer(targetOffset) {
|
|
113
|
+
while (!__classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_eof, "f") && __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").windowEnd() < targetOffset) {
|
|
114
|
+
const chunk = await __classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_streamBuffer, "f").readNext();
|
|
115
|
+
if (chunk === undefined) {
|
|
116
|
+
__classPrivateFieldSet(this, _FixedSizeStreamReadableBufferAdapter_eof, true, "f");
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
__classPrivateFieldGet(this, _FixedSizeStreamReadableBufferAdapter_circularBuffer, "f").push(chunk);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof RangeError) {
|
|
124
|
+
throw new RangeError(`Cannot buffer chunk of size ${chunk.length}: ${error.message}`);
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { IStreamReadableBuffer } from "./streams.js";
|
|
2
|
+
import type { IReadableBuffer } from "../buffers/buffer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Adapter that wraps an IStreamReadableBuffer to provide forward-only reading.
|
|
5
|
+
* This adapter only allows forward sequential reads. Attempting to read backwards
|
|
6
|
+
* or seek forward will throw an error. The buffer grows as needed and shrinks
|
|
7
|
+
* by discarding consumed data to save memory.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ForwardOnlyStreamReadableBufferAdapter implements IReadableBuffer {
|
|
10
|
+
#private;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new forward-only adapter from a stream readable buffer.
|
|
13
|
+
* Reads must be sequential from the current position.
|
|
14
|
+
*
|
|
15
|
+
* @param streamBuffer The stream buffer to adapt.
|
|
16
|
+
*/
|
|
17
|
+
constructor(streamBuffer: IStreamReadableBuffer);
|
|
18
|
+
/**
|
|
19
|
+
* Reads a sequence of bytes from the buffer starting at the current position.
|
|
20
|
+
* Only sequential reads are allowed; attempting to read backwards or seek
|
|
21
|
+
* forward will throw an error. The read advances the current position.
|
|
22
|
+
*
|
|
23
|
+
* @param offset The byte offset to start reading from (must be current position).
|
|
24
|
+
* @param size The number of bytes to read.
|
|
25
|
+
* @returns A Promise that resolves to a new Uint8Array containing the read bytes, or undefined if the read would exceed buffer bounds.
|
|
26
|
+
* @throws Error if attempting to read backwards or seek forward.
|
|
27
|
+
*/
|
|
28
|
+
read(offset: number, size: number): Promise<Uint8Array | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if more data can be read at the specified offset.
|
|
31
|
+
* Only allows reading at the current position; throws errors for backward or forward seeking.
|
|
32
|
+
* @param offset - The offset to check for readability
|
|
33
|
+
* @returns Promise resolving to true if data is available at the current position, false otherwise
|
|
34
|
+
*/
|
|
35
|
+
canReadMore(offset: number): Promise<boolean>;
|
|
36
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _ForwardOnlyStreamReadableBufferAdapter_instances, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, _ForwardOnlyStreamReadableBufferAdapter_streamBuffer, _ForwardOnlyStreamReadableBufferAdapter_eof, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, _ForwardOnlyStreamReadableBufferAdapter_ensureBufferedUpTo;
|
|
13
|
+
/**
|
|
14
|
+
* Adapter that wraps an IStreamReadableBuffer to provide forward-only reading.
|
|
15
|
+
* This adapter only allows forward sequential reads. Attempting to read backwards
|
|
16
|
+
* or seek forward will throw an error. The buffer grows as needed and shrinks
|
|
17
|
+
* by discarding consumed data to save memory.
|
|
18
|
+
*/
|
|
19
|
+
export class ForwardOnlyStreamReadableBufferAdapter {
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new forward-only adapter from a stream readable buffer.
|
|
22
|
+
* Reads must be sequential from the current position.
|
|
23
|
+
*
|
|
24
|
+
* @param streamBuffer The stream buffer to adapt.
|
|
25
|
+
*/
|
|
26
|
+
constructor(streamBuffer) {
|
|
27
|
+
_ForwardOnlyStreamReadableBufferAdapter_instances.add(this);
|
|
28
|
+
_ForwardOnlyStreamReadableBufferAdapter_bufferedData.set(this, null);
|
|
29
|
+
_ForwardOnlyStreamReadableBufferAdapter_streamBuffer.set(this, void 0);
|
|
30
|
+
_ForwardOnlyStreamReadableBufferAdapter_eof.set(this, false);
|
|
31
|
+
_ForwardOnlyStreamReadableBufferAdapter_currentPosition.set(this, 0);
|
|
32
|
+
__classPrivateFieldSet(this, _ForwardOnlyStreamReadableBufferAdapter_streamBuffer, streamBuffer, "f");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Reads a sequence of bytes from the buffer starting at the current position.
|
|
36
|
+
* Only sequential reads are allowed; attempting to read backwards or seek
|
|
37
|
+
* forward will throw an error. The read advances the current position.
|
|
38
|
+
*
|
|
39
|
+
* @param offset The byte offset to start reading from (must be current position).
|
|
40
|
+
* @param size The number of bytes to read.
|
|
41
|
+
* @returns A Promise that resolves to a new Uint8Array containing the read bytes, or undefined if the read would exceed buffer bounds.
|
|
42
|
+
* @throws Error if attempting to read backwards or seek forward.
|
|
43
|
+
*/
|
|
44
|
+
async read(offset, size) {
|
|
45
|
+
if (offset < 0 || size < 0) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
if (offset < __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f")) {
|
|
49
|
+
throw new Error("Cannot read backwards from current position");
|
|
50
|
+
}
|
|
51
|
+
if (offset > __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f")) {
|
|
52
|
+
throw new Error("Cannot seek forward; reads must be sequential");
|
|
53
|
+
}
|
|
54
|
+
// At this point, offset must equal currentPosition due to the checks above
|
|
55
|
+
await __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_instances, "m", _ForwardOnlyStreamReadableBufferAdapter_ensureBufferedUpTo).call(this, __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f") + size);
|
|
56
|
+
if (__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f") === null || size > __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f").length) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const result = __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f").slice(0, size);
|
|
60
|
+
// Advance position
|
|
61
|
+
__classPrivateFieldSet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f") + size, "f");
|
|
62
|
+
// Trim buffer to discard consumed data
|
|
63
|
+
// Split from size position onwards
|
|
64
|
+
__classPrivateFieldSet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f").slice(size), "f");
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Checks if more data can be read at the specified offset.
|
|
69
|
+
* Only allows reading at the current position; throws errors for backward or forward seeking.
|
|
70
|
+
* @param offset - The offset to check for readability
|
|
71
|
+
* @returns Promise resolving to true if data is available at the current position, false otherwise
|
|
72
|
+
*/
|
|
73
|
+
async canReadMore(offset) {
|
|
74
|
+
if (offset < __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f")) {
|
|
75
|
+
throw new Error("Cannot read backwards from current position");
|
|
76
|
+
}
|
|
77
|
+
if (offset > __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f")) {
|
|
78
|
+
throw new Error("Cannot seek forward; reads must be sequential");
|
|
79
|
+
}
|
|
80
|
+
await __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_instances, "m", _ForwardOnlyStreamReadableBufferAdapter_ensureBufferedUpTo).call(this, __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f") + 1);
|
|
81
|
+
if (__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f") === null) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f").length > 0;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
_ForwardOnlyStreamReadableBufferAdapter_bufferedData = new WeakMap(), _ForwardOnlyStreamReadableBufferAdapter_streamBuffer = new WeakMap(), _ForwardOnlyStreamReadableBufferAdapter_eof = new WeakMap(), _ForwardOnlyStreamReadableBufferAdapter_currentPosition = new WeakMap(), _ForwardOnlyStreamReadableBufferAdapter_instances = new WeakSet(), _ForwardOnlyStreamReadableBufferAdapter_ensureBufferedUpTo =
|
|
88
|
+
/**
|
|
89
|
+
* Ensures data is buffered up to the specified target offset.
|
|
90
|
+
* Loads chunks progressively until the target is reached or EOF.
|
|
91
|
+
*/
|
|
92
|
+
async function _ForwardOnlyStreamReadableBufferAdapter_ensureBufferedUpTo(targetOffset) {
|
|
93
|
+
// Load chunks until we have enough data or reach EOF
|
|
94
|
+
while (!__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_eof, "f") &&
|
|
95
|
+
(__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f") === null ||
|
|
96
|
+
__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f").length + __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_currentPosition, "f") < targetOffset)) {
|
|
97
|
+
const chunk = await __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_streamBuffer, "f").readNext();
|
|
98
|
+
if (chunk === undefined) {
|
|
99
|
+
__classPrivateFieldSet(this, _ForwardOnlyStreamReadableBufferAdapter_eof, true, "f");
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
// Expand buffer to accommodate new chunk
|
|
103
|
+
if (__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f") === null) {
|
|
104
|
+
__classPrivateFieldSet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, chunk, "f");
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const currentLength = __classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f").length;
|
|
108
|
+
const newBuffer = new Uint8Array(currentLength + chunk.length);
|
|
109
|
+
newBuffer.set(__classPrivateFieldGet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, "f"));
|
|
110
|
+
newBuffer.set(chunk, currentLength);
|
|
111
|
+
__classPrivateFieldSet(this, _ForwardOnlyStreamReadableBufferAdapter_bufferedData, newBuffer, "f");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IStreamReadableBuffer } from "./streams.js";
|
|
2
|
+
/**
|
|
3
|
+
* A readable buffer implementation that reads data sequentially from a ReadableStream.
|
|
4
|
+
* This provides streaming read capabilities for large data sources.
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Stream-backed: Reads data sequentially from a ReadableStream.
|
|
8
|
+
* - Memory efficient: Processes data in chunks without loading everything into memory.
|
|
9
|
+
* - Web standard: Uses the Web Streams API for broad compatibility.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const response = await fetch('large-file.avro');
|
|
14
|
+
* const stream = response.body!;
|
|
15
|
+
* const buffer = new StreamReadableBuffer(stream);
|
|
16
|
+
*
|
|
17
|
+
* let chunk;
|
|
18
|
+
* while ((chunk = await buffer.readNext()) !== undefined) {
|
|
19
|
+
* // Process chunk
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class StreamReadableBuffer implements IStreamReadableBuffer {
|
|
24
|
+
#private;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new StreamReadableBuffer from the provided ReadableStream.
|
|
27
|
+
*
|
|
28
|
+
* @param stream The ReadableStream to read data from.
|
|
29
|
+
*/
|
|
30
|
+
constructor(stream: ReadableStream<Uint8Array>);
|
|
31
|
+
/**
|
|
32
|
+
* Reads the next chunk of data from the stream.
|
|
33
|
+
*
|
|
34
|
+
* @returns A Promise that resolves to the next Uint8Array chunk, or undefined if the stream is exhausted.
|
|
35
|
+
*/
|
|
36
|
+
readNext(): Promise<Uint8Array | undefined>;
|
|
37
|
+
/**
|
|
38
|
+
* Closes the stream and releases the reader lock.
|
|
39
|
+
*/
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _StreamReadableBuffer_reader;
|
|
13
|
+
/**
|
|
14
|
+
* A readable buffer implementation that reads data sequentially from a ReadableStream.
|
|
15
|
+
* This provides streaming read capabilities for large data sources.
|
|
16
|
+
*
|
|
17
|
+
* Key features:
|
|
18
|
+
* - Stream-backed: Reads data sequentially from a ReadableStream.
|
|
19
|
+
* - Memory efficient: Processes data in chunks without loading everything into memory.
|
|
20
|
+
* - Web standard: Uses the Web Streams API for broad compatibility.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const response = await fetch('large-file.avro');
|
|
25
|
+
* const stream = response.body!;
|
|
26
|
+
* const buffer = new StreamReadableBuffer(stream);
|
|
27
|
+
*
|
|
28
|
+
* let chunk;
|
|
29
|
+
* while ((chunk = await buffer.readNext()) !== undefined) {
|
|
30
|
+
* // Process chunk
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class StreamReadableBuffer {
|
|
35
|
+
/**
|
|
36
|
+
* Creates a new StreamReadableBuffer from the provided ReadableStream.
|
|
37
|
+
*
|
|
38
|
+
* @param stream The ReadableStream to read data from.
|
|
39
|
+
*/
|
|
40
|
+
constructor(stream) {
|
|
41
|
+
_StreamReadableBuffer_reader.set(this, void 0);
|
|
42
|
+
__classPrivateFieldSet(this, _StreamReadableBuffer_reader, stream.getReader(), "f");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Reads the next chunk of data from the stream.
|
|
46
|
+
*
|
|
47
|
+
* @returns A Promise that resolves to the next Uint8Array chunk, or undefined if the stream is exhausted.
|
|
48
|
+
*/
|
|
49
|
+
async readNext() {
|
|
50
|
+
const { done, value } = await __classPrivateFieldGet(this, _StreamReadableBuffer_reader, "f").read();
|
|
51
|
+
if (done) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Closes the stream and releases the reader lock.
|
|
58
|
+
*/
|
|
59
|
+
// deno-lint-ignore require-await
|
|
60
|
+
async close() {
|
|
61
|
+
__classPrivateFieldGet(this, _StreamReadableBuffer_reader, "f").releaseLock();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
_StreamReadableBuffer_reader = new WeakMap();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IReadableBuffer } from "../buffers/buffer.js";
|
|
2
|
+
import type { IStreamReadableBuffer } from "./streams.js";
|
|
3
|
+
/**
|
|
4
|
+
* Adapter that wraps an IStreamReadableBuffer to provide IReadableBuffer interface.
|
|
5
|
+
* This buffers stream content progressively to enable random access reads.
|
|
6
|
+
*/
|
|
7
|
+
export declare class StreamReadableBufferAdapter implements IReadableBuffer {
|
|
8
|
+
#private;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new adapter from a stream readable buffer.
|
|
11
|
+
* The entire stream will be buffered in memory for random access.
|
|
12
|
+
*
|
|
13
|
+
* @param streamBuffer The stream buffer to adapt.
|
|
14
|
+
*/
|
|
15
|
+
constructor(streamBuffer: IStreamReadableBuffer);
|
|
16
|
+
/**
|
|
17
|
+
* Gets the total length of the buffer in bytes.
|
|
18
|
+
* This will buffer the entire stream if not already done.
|
|
19
|
+
*
|
|
20
|
+
* @returns The buffer length in bytes.
|
|
21
|
+
*/
|
|
22
|
+
length(): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Reads a sequence of bytes from the buffer starting at the specified offset.
|
|
25
|
+
* This will buffer data as needed to satisfy the read request.
|
|
26
|
+
*
|
|
27
|
+
* @param offset The byte offset to start reading from (0-based).
|
|
28
|
+
* @param size The number of bytes to read.
|
|
29
|
+
* @returns A Promise that resolves to a new Uint8Array containing the read bytes, or undefined if the read would exceed buffer bounds.
|
|
30
|
+
*/
|
|
31
|
+
read(offset: number, size: number): Promise<Uint8Array | undefined>;
|
|
32
|
+
/**
|
|
33
|
+
* Checks if more data can be read starting at the given offset.
|
|
34
|
+
* @param offset The byte offset to check.
|
|
35
|
+
* @returns True if at least one byte can be read from the offset.
|
|
36
|
+
*/
|
|
37
|
+
canReadMore(offset: number): Promise<boolean>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _StreamReadableBufferAdapter_instances, _StreamReadableBufferAdapter_bufferedData, _StreamReadableBufferAdapter_streamBuffer, _StreamReadableBufferAdapter_eof, _StreamReadableBufferAdapter_ensureBuffered, _StreamReadableBufferAdapter_ensureBufferedUpTo;
|
|
13
|
+
/**
|
|
14
|
+
* Adapter that wraps an IStreamReadableBuffer to provide IReadableBuffer interface.
|
|
15
|
+
* This buffers stream content progressively to enable random access reads.
|
|
16
|
+
*/
|
|
17
|
+
export class StreamReadableBufferAdapter {
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new adapter from a stream readable buffer.
|
|
20
|
+
* The entire stream will be buffered in memory for random access.
|
|
21
|
+
*
|
|
22
|
+
* @param streamBuffer The stream buffer to adapt.
|
|
23
|
+
*/
|
|
24
|
+
constructor(streamBuffer) {
|
|
25
|
+
_StreamReadableBufferAdapter_instances.add(this);
|
|
26
|
+
_StreamReadableBufferAdapter_bufferedData.set(this, null);
|
|
27
|
+
_StreamReadableBufferAdapter_streamBuffer.set(this, void 0);
|
|
28
|
+
_StreamReadableBufferAdapter_eof.set(this, false);
|
|
29
|
+
__classPrivateFieldSet(this, _StreamReadableBufferAdapter_streamBuffer, streamBuffer, "f");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Gets the total length of the buffer in bytes.
|
|
33
|
+
* This will buffer the entire stream if not already done.
|
|
34
|
+
*
|
|
35
|
+
* @returns The buffer length in bytes.
|
|
36
|
+
*/
|
|
37
|
+
async length() {
|
|
38
|
+
await __classPrivateFieldGet(this, _StreamReadableBufferAdapter_instances, "m", _StreamReadableBufferAdapter_ensureBuffered).call(this);
|
|
39
|
+
return __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").length;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reads a sequence of bytes from the buffer starting at the specified offset.
|
|
43
|
+
* This will buffer data as needed to satisfy the read request.
|
|
44
|
+
*
|
|
45
|
+
* @param offset The byte offset to start reading from (0-based).
|
|
46
|
+
* @param size The number of bytes to read.
|
|
47
|
+
* @returns A Promise that resolves to a new Uint8Array containing the read bytes, or undefined if the read would exceed buffer bounds.
|
|
48
|
+
*/
|
|
49
|
+
async read(offset, size) {
|
|
50
|
+
if (offset < 0 || size < 0) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
// Check if the section is already cached
|
|
54
|
+
if (__classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f") !== null && offset + size <= __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").length) {
|
|
55
|
+
return __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").slice(offset, offset + size);
|
|
56
|
+
}
|
|
57
|
+
// Load chunks until the necessary data is available
|
|
58
|
+
await __classPrivateFieldGet(this, _StreamReadableBufferAdapter_instances, "m", _StreamReadableBufferAdapter_ensureBufferedUpTo).call(this, offset + size);
|
|
59
|
+
// Check if we have enough data after buffering
|
|
60
|
+
if (__classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f") === null || offset + size > __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").length) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").slice(offset, offset + size);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks if more data can be read starting at the given offset.
|
|
67
|
+
* @param offset The byte offset to check.
|
|
68
|
+
* @returns True if at least one byte can be read from the offset.
|
|
69
|
+
*/
|
|
70
|
+
async canReadMore(offset) {
|
|
71
|
+
const result = await this.read(offset, 1);
|
|
72
|
+
return result !== undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
_StreamReadableBufferAdapter_bufferedData = new WeakMap(), _StreamReadableBufferAdapter_streamBuffer = new WeakMap(), _StreamReadableBufferAdapter_eof = new WeakMap(), _StreamReadableBufferAdapter_instances = new WeakSet(), _StreamReadableBufferAdapter_ensureBuffered =
|
|
76
|
+
/**
|
|
77
|
+
* Ensures the entire stream is buffered in memory.
|
|
78
|
+
*/
|
|
79
|
+
async function _StreamReadableBufferAdapter_ensureBuffered() {
|
|
80
|
+
await __classPrivateFieldGet(this, _StreamReadableBufferAdapter_instances, "m", _StreamReadableBufferAdapter_ensureBufferedUpTo).call(this, Infinity);
|
|
81
|
+
}, _StreamReadableBufferAdapter_ensureBufferedUpTo =
|
|
82
|
+
/**
|
|
83
|
+
* Ensures data is buffered up to the specified target offset.
|
|
84
|
+
* Loads chunks progressively until the target is reached or EOF.
|
|
85
|
+
*/
|
|
86
|
+
async function _StreamReadableBufferAdapter_ensureBufferedUpTo(targetOffset) {
|
|
87
|
+
// Initialize buffer if needed
|
|
88
|
+
if (__classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f") === null) {
|
|
89
|
+
__classPrivateFieldSet(this, _StreamReadableBufferAdapter_bufferedData, new Uint8Array(0), "f");
|
|
90
|
+
}
|
|
91
|
+
// Load chunks until we have enough data or reach EOF
|
|
92
|
+
while (!__classPrivateFieldGet(this, _StreamReadableBufferAdapter_eof, "f") && __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").length < targetOffset) {
|
|
93
|
+
const chunk = await __classPrivateFieldGet(this, _StreamReadableBufferAdapter_streamBuffer, "f").readNext();
|
|
94
|
+
if (chunk === undefined) {
|
|
95
|
+
__classPrivateFieldSet(this, _StreamReadableBufferAdapter_eof, true, "f");
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
// Expand buffer to accommodate new chunk
|
|
99
|
+
const currentLength = __classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f").length;
|
|
100
|
+
const newBuffer = new Uint8Array(currentLength + chunk.length);
|
|
101
|
+
newBuffer.set(__classPrivateFieldGet(this, _StreamReadableBufferAdapter_bufferedData, "f"));
|
|
102
|
+
newBuffer.set(chunk, currentLength);
|
|
103
|
+
__classPrivateFieldSet(this, _StreamReadableBufferAdapter_bufferedData, newBuffer, "f");
|
|
104
|
+
}
|
|
105
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { IStreamWritableBuffer } from "./streams.js";
|
|
2
|
+
/**
|
|
3
|
+
* A writable buffer implementation that writes data sequentially to a WritableStream.
|
|
4
|
+
* This provides streaming write capabilities for large data outputs.
|
|
5
|
+
*
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Stream-backed: Writes data sequentially to a WritableStream.
|
|
8
|
+
* - Memory efficient: Processes data in chunks without buffering everything in memory.
|
|
9
|
+
* - Web standard: Uses the Web Streams API for broad compatibility.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const stream = new WritableStream({
|
|
14
|
+
* write(chunk) {
|
|
15
|
+
* // Handle chunk
|
|
16
|
+
* }
|
|
17
|
+
* });
|
|
18
|
+
* const buffer = new StreamWritableBuffer(stream);
|
|
19
|
+
*
|
|
20
|
+
* await buffer.writeBytes(new Uint8Array([1, 2, 3, 4]));
|
|
21
|
+
* await buffer.close();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class StreamWritableBuffer implements IStreamWritableBuffer {
|
|
25
|
+
#private;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a new StreamWritableBuffer from the provided WritableStream.
|
|
28
|
+
*
|
|
29
|
+
* @param stream The WritableStream to write data to.
|
|
30
|
+
*/
|
|
31
|
+
constructor(stream: WritableStream<Uint8Array>);
|
|
32
|
+
/**
|
|
33
|
+
* Writes bytes to the stream.
|
|
34
|
+
*
|
|
35
|
+
* @param data The bytes to write.
|
|
36
|
+
*/
|
|
37
|
+
writeBytes(data: Uint8Array): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Closes the stream and releases the writer lock.
|
|
40
|
+
*/
|
|
41
|
+
close(): Promise<void>;
|
|
42
|
+
}
|