diff --git a/node/_tools/config.json b/node/_tools/config.json index ff5ea4a29559..a8a4a2ad3cb5 100644 --- a/node/_tools/config.json +++ b/node/_tools/config.json @@ -18,6 +18,7 @@ "test-buffer-arraybuffer.js", "test-buffer-bytelength.js", "test-buffer-from.js", + "test-buffer-indexof.js", "test-dns-lookup.js", "test-dns.js", "test-event-emitter-errors.js", diff --git a/node/_tools/suites/parallel/test-buffer-indexof.js b/node/_tools/suites/parallel/test-buffer-indexof.js index be81e63b724d..d4c3b80f2029 100644 --- a/node/_tools/suites/parallel/test-buffer-indexof.js +++ b/node/_tools/suites/parallel/test-buffer-indexof.js @@ -601,6 +601,8 @@ pattern = reallyLong.slice(0, 2000000); // first 2/5ths. assert.strictEqual(reallyLong.lastIndexOf(pattern), 0); // Test truncation of Number arguments to uint8 +// TODO(Soremwar) +// Enable once multi byte number search is available // { // const buf = Buffer.from('this is a test'); // assert.strictEqual(buf.indexOf(0x6973), 3); diff --git a/node/internal_binding/buffer.ts b/node/internal_binding/buffer.ts index b2f36eb326cc..fe7edbc8e38d 100644 --- a/node/internal_binding/buffer.ts +++ b/node/internal_binding/buffer.ts @@ -1,6 +1,18 @@ import { Encodings } from "./_node.ts"; import { indexOf } from "../../bytes/mod.ts"; +export function numberToBytes(n: number): Uint8Array { + if (n === 0) return new Uint8Array([0]); + + const bytes = []; + bytes.unshift(n & 255); + while (n >= 256) { + n = n >>> 8; + bytes.unshift(n & 255); + } + return new Uint8Array(bytes); +} + // TODO(Soremwar) // Check if offset or buffer can be transform in order to just use std's lastIndexOf directly // This implementation differs from std's lastIndexOf in the fact that @@ -88,24 +100,26 @@ function indexOfBuffer( return indexOf(targetBuffer, buffer, byteOffset); } +// TODO(Soremwar) +// Node's implementation is a very obscure algorithm that I haven't been able to crack just yet function indexOfNumber( targetBuffer: Uint8Array, number: number, byteOffset: number, forwardDirection: boolean, ) { - if (!forwardDirection) { - return Uint8Array.prototype.lastIndexOf.call( - targetBuffer, - number, - byteOffset, - ); + const bytes = numberToBytes(number); + + if (bytes.length > 1) { + throw new Error("Multi byte number search is not supported"); } - return Uint8Array.prototype.indexOf.call( + return indexOfBuffer( targetBuffer, - number, + numberToBytes(number), byteOffset, + Encodings.UTF8, + forwardDirection, ); }