diff --git a/src/auth/pbkdf2.ts b/src/auth/pbkdf2.ts index 5987944..e6c53ba 100644 --- a/src/auth/pbkdf2.ts +++ b/src/auth/pbkdf2.ts @@ -31,8 +31,8 @@ export async function pbkdf2( return crypto.subtle.deriveBits( { name: "PBKDF2", - salt: salt, - iterations: iterations, + salt: salt.buffer as ArrayBuffer, + iterations, hash: { name: algo, }, diff --git a/src/protocol/header.ts b/src/protocol/header.ts index 20fb8b6..44c65e1 100644 --- a/src/protocol/header.ts +++ b/src/protocol/header.ts @@ -28,7 +28,11 @@ export function setHeader( } export function parseHeader(buffer: Uint8Array): MessageHeader { - const view = new DataView(buffer.buffer); + const view = new DataView( + buffer.buffer, + buffer.byteOffset, + buffer.byteLength, + ); return { messageLength: view.getUint32(0, true), requestId: view.getUint32(4, true), diff --git a/src/protocol/message.ts b/src/protocol/message.ts index 38ec721..4ebe918 100644 --- a/src/protocol/message.ts +++ b/src/protocol/message.ts @@ -53,8 +53,13 @@ function serializeSections( view.setUint8(0, 1); view.setUint32(1, section1.byteLength - 1, true); - let pos = 4; + let pos = 5; + // write identifuer + section1.set(identifier, pos); + pos += identifier.byteLength; + + // write documents for (const doc of docs) { section1.set(doc, pos); pos += doc.byteLength; @@ -103,29 +108,29 @@ export function deserializeMessage( header: MessageHeader, buffer: Uint8Array, ): Message { - const view = new DataView(buffer.buffer); + const view = new DataView( + buffer.buffer, + buffer.byteOffset, + buffer.byteLength, + ); - const flags = view.getInt32(0); + const flags = view.getInt32(0, true); const sections: Section[] = []; let pos = 4; - while (pos < view.byteLength) { + while (pos < buffer.byteLength) { const kind = view.getInt8(pos); pos++; if (kind === 0) { const docLen = view.getInt32(pos, true); - const document = deserialize( - new Uint8Array(view.buffer.slice(pos, pos + docLen)), - ); + const document = deserialize(buffer.slice(pos, pos + docLen)); pos += docLen; sections.push({ document }); } else if (kind === 1) { const len = view.getInt32(pos, true); - const sectionBody = new Uint8Array( - view.buffer.slice(pos + 4, pos + len - 4), - ); + const sectionBody = buffer.slice(pos + 4, pos + len); const identifierEndPos = sectionBody.findIndex((byte) => byte === 0); - const identifier = decoder.decode(buffer.slice(0, identifierEndPos)); + const identifier = decoder.decode(sectionBody.slice(0, identifierEndPos)); const docsBuffer = sectionBody.slice(identifierEndPos + 1); const documents = parseDocuments(docsBuffer); pos += len; @@ -146,7 +151,11 @@ export function deserializeMessage( function parseDocuments(buffer: Uint8Array): Document[] { let pos = 0; const docs = []; - const view = new DataView(buffer.buffer); + const view = new DataView( + buffer.buffer, + buffer.byteOffset, + buffer.byteLength, + ); while (pos < buffer.byteLength) { const docLen = view.getInt32(pos, true); const doc = deserialize(buffer.slice(pos, pos + docLen)); diff --git a/src/protocol/protocol.ts b/src/protocol/protocol.ts index 51aad19..432e90d 100644 --- a/src/protocol/protocol.ts +++ b/src/protocol/protocol.ts @@ -150,7 +150,7 @@ export class WireProtocol { b: number, ): Promise { const reader = this.#conn.readable.getReader({ mode: "byob" }); - const { value } = await reader.read(new Uint8Array(b)); + const { value } = await reader.read(new Uint8Array(b), { min: b }); reader.releaseLock(); return value; } diff --git a/tests/cases/03_crud.ts b/tests/cases/03_crud.ts index 3979c6d..807b30c 100644 --- a/tests/cases/03_crud.ts +++ b/tests/cases/03_crud.ts @@ -1,4 +1,3 @@ -import { assertInstanceOf } from "jsr:@std/assert@^0.220.1/assert_instance_of"; import type { Database, MongoClient, ObjectId } from "../../mod.ts"; import { MongoInvalidArgumentError, @@ -10,6 +9,7 @@ import { afterEach, assert, assertEquals, + assertInstanceOf, assertRejects, beforeEach, describe, diff --git a/tests/deps.ts b/tests/deps.ts index 77e6565..1d7fad6 100644 --- a/tests/deps.ts +++ b/tests/deps.ts @@ -1,6 +1,7 @@ export { assert, assertEquals, + assertInstanceOf, assertNotEquals, assertRejects, assertThrows,