1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- /* globals atob, btoa, crypto */
- /* istanbul ignore file */
- 'use strict'
- const bytes = require('./core')
- bytes.from = (_from, _encoding) => {
- if (_from instanceof DataView) return _from
- if (_from instanceof ArrayBuffer) return new DataView(_from)
- let buffer
- if (typeof _from === 'string') {
- if (!_encoding) {
- _encoding = 'utf-8'
- } else if (_encoding === 'base64') {
- buffer = Uint8Array.from(atob(_from), c => c.charCodeAt(0)).buffer
- return new DataView(buffer)
- }
- if (_encoding !== 'utf-8') throw new Error('Browser support for encodings other than utf-8 not implemented')
- return new DataView((new TextEncoder()).encode(_from).buffer)
- } else if (typeof _from === 'object') {
- if (ArrayBuffer.isView(_from)) {
- if (_from.byteLength === _from.buffer.byteLength) return new DataView(_from.buffer)
- else return new DataView(_from.buffer, _from.byteOffset, _from.byteLength)
- }
- }
- throw new Error('Unkown type. Cannot convert to ArrayBuffer')
- }
- bytes.toString = (_from, encoding) => {
- _from = bytes(_from, encoding)
- const uint = new Uint8Array(_from.buffer, _from.byteOffset, _from.byteLength)
- const str = String.fromCharCode(...uint)
- if (encoding === 'base64') {
- /* would be nice to find a way to do this directly from a buffer
- * instead of doing two string conversions
- */
- return btoa(str)
- } else {
- return str
- }
- }
- bytes.native = (_from, encoding) => {
- if (_from instanceof Uint8Array) return _from
- _from = bytes.from(_from, encoding)
- return new Uint8Array(_from.buffer, _from.byteOffset, _from.byteLength)
- }
- if (process.browser) bytes._randomFill = (...args) => crypto.getRandomValues(...args)
- module.exports = bytes
|