UNPKG

8.4 kBJavaScriptView Raw
1"use strict";
2// *****************************************************************************
3// Copyright (C) 2020 TypeFox and others.
4//
5// This program and the accompanying materials are made available under the
6// terms of the Eclipse Public License v. 2.0 which is available at
7// http://www.eclipse.org/legal/epl-2.0.
8//
9// This Source Code may also be made available under the following Secondary
10// Licenses when the conditions for such availability set forth in the Eclipse
11// Public License v. 2.0 are satisfied: GNU General Public License, version 2
12// with the GNU Classpath Exception which is available at
13// https://www.gnu.org/software/classpath/license.html.
14//
15// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
16// *****************************************************************************
17/*---------------------------------------------------------------------------------------------
18 * Copyright (c) Microsoft Corporation. All rights reserved.
19 * Licensed under the MIT License. See License.txt in the project root for license information.
20 *--------------------------------------------------------------------------------------------*/
21// based on https://github.com/microsoft/vscode/blob/04c36be045a94fee58e5f8992d3e3fd980294a84/src/vs/base/common/buffer.ts
22Object.defineProperty(exports, "__esModule", { value: true });
23exports.BinaryBufferWriteableStream = exports.BinaryBufferReadableBufferedStream = exports.BinaryBufferReadableStream = exports.BinaryBufferReadable = exports.BinaryBuffer = void 0;
24/* eslint-disable no-null/no-null */
25const safer_buffer_1 = require("safer-buffer");
26const iconv = require("iconv-lite");
27const streams = require("./stream");
28const hasBuffer = (typeof Buffer !== 'undefined');
29const hasTextEncoder = (typeof TextEncoder !== 'undefined');
30const hasTextDecoder = (typeof TextDecoder !== 'undefined');
31let textEncoder;
32let textDecoder;
33class BinaryBuffer {
34 constructor(buffer) {
35 this.buffer = buffer;
36 this.byteLength = this.buffer.byteLength;
37 }
38 static alloc(byteLength) {
39 if (hasBuffer) {
40 return new BinaryBuffer(Buffer.allocUnsafe(byteLength));
41 }
42 else {
43 return new BinaryBuffer(new Uint8Array(byteLength));
44 }
45 }
46 static wrap(actual) {
47 if (hasBuffer && !(Buffer.isBuffer(actual))) {
48 // https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length
49 // Create a zero-copy Buffer wrapper around the ArrayBuffer pointed to by the Uint8Array
50 actual = Buffer.from(actual.buffer, actual.byteOffset, actual.byteLength);
51 }
52 return new BinaryBuffer(actual);
53 }
54 static fromString(source) {
55 if (hasBuffer) {
56 return new BinaryBuffer(Buffer.from(source));
57 }
58 else if (hasTextEncoder) {
59 if (!textEncoder) {
60 textEncoder = new TextEncoder();
61 }
62 return new BinaryBuffer(textEncoder.encode(source));
63 }
64 else {
65 return new BinaryBuffer(iconv.encode(source, 'utf8'));
66 }
67 }
68 static concat(buffers, totalLength) {
69 if (typeof totalLength === 'undefined') {
70 totalLength = 0;
71 for (let i = 0, len = buffers.length; i < len; i++) {
72 totalLength += buffers[i].byteLength;
73 }
74 }
75 const ret = BinaryBuffer.alloc(totalLength);
76 let offset = 0;
77 for (let i = 0, len = buffers.length; i < len; i++) {
78 const element = buffers[i];
79 ret.set(element, offset);
80 offset += element.byteLength;
81 }
82 return ret;
83 }
84 toString() {
85 if (hasBuffer) {
86 return this.buffer.toString();
87 }
88 else if (hasTextDecoder) {
89 if (!textDecoder) {
90 textDecoder = new TextDecoder();
91 }
92 return textDecoder.decode(this.buffer);
93 }
94 else {
95 return iconv.decode(safer_buffer_1.Buffer.from(this.buffer), 'utf8');
96 }
97 }
98 slice(start, end) {
99 // IMPORTANT: use subarray instead of slice because TypedArray#slice
100 // creates shallow copy and NodeBuffer#slice doesn't. The use of subarray
101 // ensures the same, performant, behaviour.
102 return new BinaryBuffer(this.buffer.subarray(start, end));
103 }
104 set(array, offset) {
105 if (array instanceof BinaryBuffer) {
106 this.buffer.set(array.buffer, offset);
107 }
108 else {
109 this.buffer.set(array, offset);
110 }
111 }
112 readUInt32BE(offset) {
113 return (this.buffer[offset] * 2 ** 24
114 + this.buffer[offset + 1] * 2 ** 16
115 + this.buffer[offset + 2] * 2 ** 8
116 + this.buffer[offset + 3]);
117 }
118 writeUInt32BE(value, offset) {
119 this.buffer[offset + 3] = value;
120 value = value >>> 8;
121 this.buffer[offset + 2] = value;
122 value = value >>> 8;
123 this.buffer[offset + 1] = value;
124 value = value >>> 8;
125 this.buffer[offset] = value;
126 }
127 readUInt32LE(offset) {
128 return (((this.buffer[offset + 0] << 0) >>> 0) |
129 ((this.buffer[offset + 1] << 8) >>> 0) |
130 ((this.buffer[offset + 2] << 16) >>> 0) |
131 ((this.buffer[offset + 3] << 24) >>> 0));
132 }
133 writeUInt32LE(value, offset) {
134 this.buffer[offset + 0] = (value & 0b11111111);
135 value = value >>> 8;
136 this.buffer[offset + 1] = (value & 0b11111111);
137 value = value >>> 8;
138 this.buffer[offset + 2] = (value & 0b11111111);
139 value = value >>> 8;
140 this.buffer[offset + 3] = (value & 0b11111111);
141 }
142 readUInt8(offset) {
143 return this.buffer[offset];
144 }
145 writeUInt8(value, offset) {
146 this.buffer[offset] = value;
147 }
148}
149exports.BinaryBuffer = BinaryBuffer;
150var BinaryBufferReadable;
151(function (BinaryBufferReadable) {
152 function toBuffer(readable) {
153 return streams.consumeReadable(readable, chunks => BinaryBuffer.concat(chunks));
154 }
155 BinaryBufferReadable.toBuffer = toBuffer;
156 function fromBuffer(buffer) {
157 return streams.toReadable(buffer);
158 }
159 BinaryBufferReadable.fromBuffer = fromBuffer;
160 function fromReadable(readable) {
161 return {
162 read() {
163 const value = readable.read();
164 if (typeof value === 'string') {
165 return BinaryBuffer.fromString(value);
166 }
167 return null;
168 }
169 };
170 }
171 BinaryBufferReadable.fromReadable = fromReadable;
172})(BinaryBufferReadable = exports.BinaryBufferReadable || (exports.BinaryBufferReadable = {}));
173var BinaryBufferReadableStream;
174(function (BinaryBufferReadableStream) {
175 function toBuffer(stream) {
176 return streams.consumeStream(stream, chunks => BinaryBuffer.concat(chunks));
177 }
178 BinaryBufferReadableStream.toBuffer = toBuffer;
179 function fromBuffer(buffer) {
180 return streams.toStream(buffer, chunks => BinaryBuffer.concat(chunks));
181 }
182 BinaryBufferReadableStream.fromBuffer = fromBuffer;
183})(BinaryBufferReadableStream = exports.BinaryBufferReadableStream || (exports.BinaryBufferReadableStream = {}));
184var BinaryBufferReadableBufferedStream;
185(function (BinaryBufferReadableBufferedStream) {
186 async function toBuffer(bufferedStream) {
187 if (bufferedStream.ended) {
188 return BinaryBuffer.concat(bufferedStream.buffer);
189 }
190 return BinaryBuffer.concat([
191 // Include already read chunks...
192 ...bufferedStream.buffer,
193 // ...and all additional chunks
194 await BinaryBufferReadableStream.toBuffer(bufferedStream.stream)
195 ]);
196 }
197 BinaryBufferReadableBufferedStream.toBuffer = toBuffer;
198})(BinaryBufferReadableBufferedStream = exports.BinaryBufferReadableBufferedStream || (exports.BinaryBufferReadableBufferedStream = {}));
199var BinaryBufferWriteableStream;
200(function (BinaryBufferWriteableStream) {
201 function create(options) {
202 return streams.newWriteableStream(chunks => BinaryBuffer.concat(chunks), options);
203 }
204 BinaryBufferWriteableStream.create = create;
205})(BinaryBufferWriteableStream = exports.BinaryBufferWriteableStream || (exports.BinaryBufferWriteableStream = {}));
206//# sourceMappingURL=buffer.js.map
\No newline at end of file