Cloudflare Workers Buffer.from()

Viewed 1380

I am not that familiar with how Buffers and all that work.

In node I can do

const str = "dasjkiodjsiodjpasiodfjodifjaspiofjsdioajfpasodfjsdioa";
let buff = Buffer.from(str); // <Buffer 64 61 73 6a 6b 6 etc...
let buffHex = Buffer.from(str, 'hex');

console.log(buff)

How would I go about doing this in Cloudflare Workers, because I get ReferenceError: Buffer is not defined

2 Answers

Buffer is a Node API. Cloudflare Workers is based on web platform APIs instead, like what you'd find in browsers. The web platform alternative to Buffer is Uint8Array. You can use the TextEncoder and TextDecoder APIs to convert between Uint8Arrays with UTF-8 encoding and text strings.

let bytes = new TextEncoder().encode(str);

To convert a Uint8Array to hex, you can use a function like:

function bytes2hex(bytes) {
  return Array.prototype.map.call(bytes,
      byte => ('0' + byte.toString(16)).slice(-2)).join('');
}

I do not recommend using a Buffer polyfill for this as it'll bloat your code size. It's better to use Uint8Array directly.

In general you should be able to find answers about how to do common operations on Uint8Array on Stack Overflow.

Here's an example of how to create a SHA-256 hash of "hello world" in Cloudflare workers, just using the globally available WebCrypto browser API. Hope it gives you some insight into how this works!

export default {
  async fetch(request)
  {
    const myText = new TextEncoder().encode('Hello world!');
    const myDigest = await crypto.subtle.digest({ name: 'SHA-256' }, myText);
    const hashArray = Array.from(new Uint8Array(myDigest));
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
    return new Response(hashHex, {status: 200});
  }
}

more info: https://developers.cloudflare.com/workers/runtime-apis/web-crypto/

Related