xmtp / xmtp-js

XMTP client SDKs, content types, and other packages written in TypeScript
https://xmtp.org/docs
217 stars 41 forks source link

ReferenceError: Buffer is not defined #487

Closed fabriguespe closed 1 year ago

fabriguespe commented 1 year ago

Describe the bug

Hello,

I encountered an issue while using the @xmtp/xmtp-js package in a React application running in the browser. The error message is ReferenceError: Buffer is not defined.

It seems that the package is trying to use Node.js's Buffer object, which is not available in the browser environment. This causes the application to crash.

CleanShot 2023-11-02 at 16 50 36@2x

Here's the error stack trace for reference:

Buffer is not defined
ReferenceError: Buffer is not defined
    at ./node_modules/@xmtp/xmtp-js/dist/web/index.js (http://localhost:3000/static/js/bundle.js:94369:8)
    at options.factory (http://localhost:3000/static/js/bundle.js:108687:31)
    at __webpack_require__ (http://localhost:3000/static/js/bundle.js:108097:33)
    at fn (http://localhost:3000/static/js/bundle.js:108344:21)
    at ./src/FloatingInbox/index.js (http://localhost:3000/static/js/bundle.js:1355:71)
    at options.factory (http://localhost:3000/static/js/bundle.js:108687:31)
    at __webpack_require__ (http://localhost:3000/static/js/bundle.js:108097:33)
    at fn (http://localhost:3000/static/js/bundle.js:108344:21)
    at ./src/Page.js (http://localhost:3000/static/js/bundle.js:1765:72)
    at options.factory (http://localhost:3000/static/js/bundle.js:108687:31)
fabriguespe commented 1 year ago

If you get into issues with Buffer and polyfills check out the fix below:

  1. Install the buffer dependency.
npm i buffer
  1. Create a new file, polyfills.js, in the root of your project.
import { Buffer } from "buffer";

window.Buffer = window.Buffer ?? Buffer;
  1. Import it into your main file on the first line.
//has to be on the first line of the file for it to work
import "./polyfills";
  1. Update config files.
const webpack = require("webpack");

module.exports = {
  configureWebpack: {
    plugins: [
      new webpack.ProvidePlugin({
        Buffer: ["buffer", "Buffer"],
      }),
    ],
  },
  transpileDependencies: true,
};
import { defineConfig } from "vite";
import { Buffer } from "buffer";

export default defineConfig({
  /**/
  define: {
    global: {
      Buffer: Buffer,
    },
  },
  /**/
});
export default {
  build: {
    extend(config, { isClient }) {
      if (isClient) {
        config.node = {
          Buffer: true,
        };
      }
    },
  },
};