aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/node/buffer.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/node/buffer.js')
-rw-r--r--src/bun.js/node/buffer.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/bun.js/node/buffer.js b/src/bun.js/node/buffer.js
new file mode 100644
index 000000000..faee19655
--- /dev/null
+++ b/src/bun.js/node/buffer.js
@@ -0,0 +1,97 @@
+"use strict";
+
+function createBuffer(BufferPrototype, BufferStatic, Realm) {
+ "use strict";
+
+ var Uint8ArraySubarray = Realm.Uint8Array.prototype.subarray;
+ var isUint8Array = (value) => value instanceof Realm.Uint8Array;
+ var SymbolToPrimitive = Realm.Symbol.toPrimitive;
+ var isArray = Realm.Array.isArray;
+ var isArrayBufferLike =
+ "SharedArrayBuffer" in Realm
+ ? () =>
+ value instanceof Realm.ArrayBuffer ||
+ value instanceof Realm.SharedArrayBuffer
+ : () => value instanceof Realm.ArrayBuffer;
+
+ var BufferInstance = class BufferInstance extends Realm.Uint8Array {
+ constructor(bufferOrLength, byteOffset, length) {
+ super(bufferOrLength, byteOffset, length);
+ }
+
+ static isBuffer(obj) {
+ return obj instanceof BufferInstance;
+ }
+
+ static from(value, encodingOrOffset, length) {
+ switch (typeof value) {
+ case "string": {
+ return BufferStatic.fromString(value, encodingOrOffset, length);
+ }
+ case "object": {
+ if (isUint8Array(value)) {
+ return BufferStatic.fromUint8Array(value, encodingOrOffset, length);
+ }
+
+ if (isArrayBufferLike(value)) {
+ return new BufferInstance(value, 0, length);
+ }
+
+ const valueOf = value.valueOf && value.valueOf();
+ if (
+ valueOf != null &&
+ valueOf !== value &&
+ (typeof valueOf === "string" || typeof valueOf === "object")
+ ) {
+ return BufferInstance.from(valueOf, encodingOrOffset, length);
+ }
+
+ if (typeof value[SymbolToPrimitive] === "function") {
+ const primitive = value[SymbolToPrimitive]("string");
+ if (typeof primitive === "string") {
+ return BufferStatic.fromString(primitive, encodingOrOffset);
+ }
+ }
+
+ if (isArray(value)) {
+ return BufferStatic.fromArray(value, encodingOrOffset, length);
+ }
+ }
+ }
+
+ throw new TypeError(
+ "First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object."
+ );
+ }
+
+ slice(start, end) {
+ return Uint8ArraySubarray.call(this, start, end);
+ }
+
+ static get poolSize() {
+ return BufferStatic._poolSize;
+ }
+
+ static set poolSize(value) {
+ BufferStatic._poolSize = value;
+ }
+
+ get parent() {
+ return this.buffer;
+ }
+
+ get offset() {
+ return this.byteOffset;
+ }
+ };
+
+ Object.assign(BufferInstance, BufferStatic);
+ Object.assign(BufferInstance.prototype, BufferPrototype);
+ Object.defineProperty(BufferInstance, "name", {
+ value: "Buffer",
+ configurable: false,
+ enumerable: false,
+ });
+
+ return BufferInstance;
+}