Skip to content

Commit fdad5c2

Browse files
committed
allow SharedArrayBuffer as well as ArrayBuffer
1 parent 7f63710 commit fdad5c2

3 files changed

Lines changed: 14 additions & 12 deletions

File tree

lib/fs.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const {
5757
} = constants;
5858

5959
const pathModule = require('path');
60-
const { isArrayBufferView, isArrayBuffer } = require('internal/util/types');
60+
const { isArrayBufferView, isArrayBuffer, isSharedArrayBuffer } = require('internal/util/types');
6161

6262
// We need to get the statValues from the binding at the callsite since
6363
// it's re-initialized after deserialization.
@@ -821,7 +821,7 @@ function write(fd, buffer, offsetOrOptions, length, position, callback) {
821821
fd = getValidatedFd(fd);
822822

823823
let offset = offsetOrOptions;
824-
const bufferToWrite = isArrayBuffer(buffer) ? new Uint8Array(buffer) : buffer;
824+
const bufferToWrite = isArrayBuffer(buffer) || isSharedArrayBuffer(buffer) ? new Uint8Array(buffer) : buffer;
825825
if (isArrayBufferView(bufferToWrite)) {
826826
callback = maybeCallback(callback || position || length || offset);
827827

@@ -891,7 +891,7 @@ function writeSync(fd, buffer, offsetOrOptions, length, position) {
891891
let result;
892892

893893
let offset = offsetOrOptions;
894-
if (isArrayBuffer(buffer)) {
894+
if (isArrayBuffer(buffer) || isSharedArrayBuffer(buffer)) {
895895
buffer = new Uint8Array(buffer);
896896
}
897897
if (isArrayBufferView(buffer)) {
@@ -2184,7 +2184,7 @@ function writeFile(path, data, options, callback) {
21842184
options = getOptions(options, { encoding: 'utf8', mode: 0o666, flag: 'w' });
21852185
const flag = options.flag || 'w';
21862186

2187-
if (isArrayBuffer(data)) {
2187+
if (isArrayBuffer(data) || isSharedArrayBuffer(data)) {
21882188
data = new Uint8Array(data);
21892189
}
21902190

@@ -2228,7 +2228,7 @@ function writeFile(path, data, options, callback) {
22282228
function writeFileSync(path, data, options) {
22292229
options = getOptions(options, { encoding: 'utf8', mode: 0o666, flag: 'w' });
22302230

2231-
if (isArrayBuffer(data)) {
2231+
if (isArrayBuffer(data) || isSharedArrayBuffer(data)) {
22322232
data = new Uint8Array(data);
22332233
}
22342234

lib/internal/fs/promises.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const {
3838
AbortError,
3939
aggregateTwoErrors,
4040
} = require('internal/errors');
41-
const { isArrayBuffer, isArrayBufferView } = require('internal/util/types');
41+
const { isArrayBuffer, isArrayBufferView, isSharedArrayBuffer } = require('internal/util/types');
4242
const { rimrafPromises } = require('internal/fs/rimraf');
4343
const {
4444
constants: {
@@ -410,7 +410,7 @@ async function writeFileHandle(filehandle, data, signal, encoding) {
410410
}
411411
return;
412412
}
413-
if (isArrayBuffer(data)) {
413+
if (isArrayBuffer(data) || isSharedArrayBuffer(data)) {
414414
data = new Uint8Array(data);
415415
} else {
416416
data = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
@@ -619,7 +619,7 @@ async function write(handle, buffer, offsetOrOptions, length, position) {
619619
return { __proto__: null, bytesWritten: 0, buffer };
620620

621621
let offset = offsetOrOptions;
622-
const bufferView = isArrayBuffer(buffer) ? new Uint8Array(buffer) : buffer;
622+
const bufferView = isArrayBuffer(buffer) || isSharedArrayBuffer(buffer) ? new Uint8Array(buffer) : buffer;
623623
if (isArrayBufferView(bufferView)) {
624624
if (typeof offset === 'object') {
625625
({
@@ -890,7 +890,7 @@ async function writeFile(path, data, options) {
890890
options = getOptions(options, { encoding: 'utf8', mode: 0o666, flag: 'w' });
891891
const flag = options.flag || 'w';
892892

893-
if (!isArrayBufferView(data) && !isArrayBuffer(data) && !isCustomIterable(data)) {
893+
if (!isArrayBufferView(data) && !isArrayBuffer(data) && !isSharedArrayBuffer(data) && !isCustomIterable(data)) {
894894
validateStringAfterArrayBufferView(data, 'data');
895895
data = Buffer.from(data, options.encoding || 'utf8');
896896
}

lib/internal/fs/utils.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const {
44
ArrayIsArray,
5+
ArrayPrototypePush,
56
BigInt,
67
Date,
78
DateNow,
@@ -42,6 +43,7 @@ const {
4243
isArrayBufferView,
4344
isBigInt64Array,
4445
isDate,
46+
isSharedArrayBuffer,
4547
isUint8Array,
4648
} = require('internal/util/types');
4749
const {
@@ -737,9 +739,9 @@ const validateAndNormalizeBufferArray = hideStackFrames((buffers, propName = 'bu
737739
for (let i = 0; i < buffers.length; i++) {
738740
const buffer = buffers[i];
739741
if (isArrayBufferView(buffers[i])) {
740-
output.push(buffer);
741-
} else if (isArrayBuffer(buffer)) {
742-
output.push(new Uint8Array(buffers[i]));
742+
ArrayPrototypePush(output, buffer);
743+
} else if (isArrayBuffer(buffer) || isSharedArrayBuffer(buffer)) {
744+
ArrayPrototypePush(output, new Uint8Array(buffers[i]));
743745
} else {
744746
throw new ERR_INVALID_ARG_TYPE(propName, ['ArrayBufferView[]', 'ArrayBuffer[]'], buffers);
745747
}

0 commit comments

Comments
 (0)