◐ Shell
clean mode source ↗

stream: allow shared array buffer sources in writable webstream adapter · nodejs/node@dfb9ede

1+

'use strict';

2+

const common = require('../common');

3+4+

const assert = require('assert');

5+

const { Buffer } = require('buffer');

6+

const { Duplex, Writable } = require('stream');

7+

const { suite, test } = require('node:test');

8+9+

const ctors = [ArrayBuffer, SharedArrayBuffer];

10+11+

suite('underlying Writable', () => {

12+

suite('in non-object mode', () => {

13+

for (const ctor of ctors) {

14+

test(`converts ${ctor.name} chunks`, async () => {

15+

const buffer = new ctor(4);

16+

const writable = new Writable({

17+

objectMode: false,

18+

write: common.mustCall((chunk, encoding, callback) => {

19+

assert(Buffer.isBuffer(chunk));

20+

assert.strictEqual(chunk.buffer, buffer);

21+

callback();

22+

}),

23+

});

24+

writable.on('error', common.mustNotCall());

25+

const writer = Writable.toWeb(writable).getWriter();

26+

await writer.write(buffer);

27+

});

28+

}

29+

});

30+31+

suite('in object mode', () => {

32+

for (const ctor of ctors) {

33+

test(`passes through ${ctor.name} chunks`, async () => {

34+

const buffer = new ctor(4);

35+

const writable = new Writable({

36+

objectMode: true,

37+

write: common.mustCall((chunk, encoding, callback) => {

38+

assert(chunk instanceof ctor);

39+

assert.strictEqual(chunk, buffer);

40+

callback();

41+

}),

42+

});

43+

writable.on('error', common.mustNotCall());

44+

const writer = Writable.toWeb(writable).getWriter();

45+

await writer.write(buffer);

46+

});

47+

}

48+

});

49+

});

50+51+

suite('underlying Duplex', () => {

52+

suite('in non-object mode', () => {

53+

for (const ctor of ctors) {

54+

test(`converts ${ctor.name} chunks`, async () => {

55+

const buffer = new ctor(4);

56+

const duplex = new Duplex({

57+

writableObjectMode: false,

58+

write: common.mustCall((chunk, encoding, callback) => {

59+

assert(Buffer.isBuffer(chunk));

60+

assert.strictEqual(chunk.buffer, buffer);

61+

callback();

62+

}),

63+

read() {

64+

this.push(null);

65+

},

66+

});

67+

duplex.on('error', common.mustNotCall());

68+

const writer = Duplex.toWeb(duplex).writable.getWriter();

69+

await writer.write(buffer);

70+

});

71+

}

72+

});

73+74+

suite('in object mode', () => {

75+

for (const ctor of ctors) {

76+

test(`passes through ${ctor.name} chunks`, async () => {

77+

const buffer = new ctor(4);

78+

const duplex = new Duplex({

79+

writableObjectMode: true,

80+

write: common.mustCall((chunk, encoding, callback) => {

81+

assert(chunk instanceof ctor);

82+

assert.strictEqual(chunk, buffer);

83+

callback();

84+

}),

85+

read() {

86+

this.push(null);

87+

},

88+

});

89+

duplex.on('error', common.mustNotCall());

90+

const writer = Duplex.toWeb(duplex).writable.getWriter();

91+

await writer.write(buffer);

92+

});

93+

}

94+

});

95+

});