aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/node/buffer.js
blob: faee196553fc3befcd35c981bc18815080da56a2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;
}