avsc icon indicating copy to clipboard operation
avsc copied to clipboard

Bun support

Open samuelgja opened this issue 1 year ago • 1 comments

Motivation

Support for new bun runtime

What's wrong

I'am using avsc in node, but starting digging into new bun runtime and I tried to move some of my lib to bun, but avsc has error while using fromBuffer method. error is:

1 | return function readTesJt(t) {
2 |   return new TesJt(
3 | 
4 |     t0._read(t)
       ^
TypeError: Expected string

Note this error is from bun run test.js script, not node.

I tried to dig into the lib itself and try to find the issue, but it's too big for me :D without knowing context. So maybe it can be easy fix, maybe not. Maybe it's issue with bun and not with avsc.

If it's issue with bun itself, please close.

Code to reproduce

I found out it only happend on string type.

const avro = require("avsc");

const object = {
  //   integer: 1,
  //   float: Math.PI,
  string: "Hello, world!",
  //   array: [10, 20, 30],
  //   map: { foo: "bar" },
  //   timestampExt: 12312312,
};

const type = avro.Type.forSchema({
  type: "record",
  name: "Test",
  fields: [
    // { name: "integer", type: "int" },
    // { name: "float", type: "float" },
    { name: "string", type: "string" },
    // { name: "array", type: { type: "array", items: "int" } },
    // { name: "map", type: { type: "map", values: "string" } },
    // {
    //   name: "timestampExt",
    //   type: { type: "long", logicalType: "int" },
    // },
  ],
});

const buf = type.toBuffer(object); 

const val = type.fromBuffer(buf); 

samuelgja avatar May 04 '23 20:05 samuelgja

Hi @samuelgja, thanks for the report. I think the root cause here is Bun's Buffer.utf8Slice; you can reproduce the issue without avsc:

Buffer.from('abc').utf8Slice(0, 1); // Throws TypeError: Expected string

I'm not familiar with Bun but it looks like the argument order here might not match the underlying implementation (which expects the encoding first, same as Node). Consider filing an issue there.

In the meantime, you may be able to work around this by patching the implementation:

Buffer.prototype.utf8Slice = function (start, end) {
  return this.toString('utf8', start, end);
}

mtth avatar May 24 '23 14:05 mtth