Skip to content

Commit

Permalink
Make uint8ArrayToString also accept an ArrayBuffer
Browse files Browse the repository at this point in the history
Fixes #14
  • Loading branch information
sindresorhus committed Jul 16, 2024
1 parent 7dad071 commit fac29ca
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 6 deletions.
2 changes: 1 addition & 1 deletion index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ console.log(uint8ArrayToString(ja, 'shift-jis'));
//=> 'こんにちは'
```
*/
export function uint8ArrayToString(array: Uint8Array, encoding?: string): string;
export function uint8ArrayToString(array: Uint8Array | ArrayBuffer, encoding?: string): string;

/**
Convert a string to a `Uint8Array` (using UTF-8 encoding).
Expand Down
27 changes: 23 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
const objectToString = Object.prototype.toString;
const uint8ArrayStringified = '[object Uint8Array]';
const arrayBufferStringified = '[object ArrayBuffer]';

export function isUint8Array(value) {
function isType(value, typeConstructor, typeStringified) {
if (!value) {
return false;
}

if (value.constructor === Uint8Array) {
if (value.constructor === typeConstructor) {
return true;
}

return objectToString.call(value) === uint8ArrayStringified;
return objectToString.call(value) === typeStringified;
}

export function isUint8Array(value) {
return isType(value, Uint8Array, uint8ArrayStringified);
}

function isArrayBuffer(value) {
return isType(value, ArrayBuffer, arrayBufferStringified);
}

function isUint8ArrayOrArrayBuffer(value) {
return isUint8Array(value) || isArrayBuffer(value);
}

export function assertUint8Array(value) {
Expand All @@ -19,6 +32,12 @@ export function assertUint8Array(value) {
}
}

export function assertUint8ArrayOrArrayBuffer(value) {
if (!isUint8ArrayOrArrayBuffer(value)) {
throw new TypeError(`Expected \`Uint8Array\` or \`ArrayBuffer\`, got \`${typeof value}\``);
}
}

export function toUint8Array(value) {
if (value instanceof ArrayBuffer) {
return new Uint8Array(value);
Expand Down Expand Up @@ -95,7 +114,7 @@ const cachedDecoders = {
};

export function uint8ArrayToString(array, encoding = 'utf8') {
assertUint8Array(array);
assertUint8ArrayOrArrayBuffer(array);
cachedDecoders[encoding] ??= new globalThis.TextDecoder(encoding);
return cachedDecoders[encoding].decode(array);
}
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ const array3 = new Uint8Array([7, 8, 9]);
//=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

### `uint8ArrayToString(array: Uint8Array, encoding?: string = 'utf8'): string`
### `uint8ArrayToString(array: Uint8Array | ArrayBuffer, encoding?: string = 'utf8'): string`

Convert a `Uint8Array` to a string.

Expand Down
5 changes: 5 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,11 @@ test('uint8ArrayToString with encoding', t => {
]), 'shift-jis'), 'こんにちは');
});

test('uint8ArrayToString with ArrayBuffer', t => {
const fixture = new Uint8Array([72, 101, 108, 108, 111]).buffer;
t.is(uint8ArrayToString(fixture), 'Hello');
});

test('uint8ArrayToBase64 and base64ToUint8Array', t => {
const fixture = stringToUint8Array('Hello');
const base64 = uint8ArrayToBase64(fixture);
Expand Down

0 comments on commit fac29ca

Please sign in to comment.